diff --git a/README.md b/README.md index fe7f0fac..1786d4ad 100644 --- a/README.md +++ b/README.md @@ -354,7 +354,7 @@ scrcpy --fullscreen scrcpy -f # short version ``` -Fullscreen can then be toggled dynamically with `Ctrl`+`f`. +Fullscreen can then be toggled dynamically with `RCtrl`+`f`. #### Rotation @@ -370,18 +370,18 @@ Possibles values are: - `2`: 180 degrees - `3`: 90 degrees clockwise -The rotation can also be changed dynamically with `Ctrl`+`←` _(left)_ and -`Ctrl`+`→` _(right)_. +The rotation can also be changed dynamically with `RCtrl`+`←` _(left)_ and +`RCtrl`+`→` _(right)_. Note that _scrcpy_ manages 3 different rotations: - - `Ctrl`+`r` requests the device to switch between portrait and landscape (the + - `RCtrl`+`r` requests the device to switch between portrait and landscape (the current running app may refuse, if it does support the requested orientation). - `--lock-video-orientation` changes the mirroring orientation (the orientation of the video sent from the device to the computer). This affects the recording. - - `--rotation` (or `Ctrl`+`←`/`Ctrl`+`→`) rotates only the window content. This - affects only the display, not the recording. + - `--rotation` (or `RCtrl`+`←`/`RCtrl`+`→`) rotates only the window content. + This affects only the display, not the recording. ### Other mirroring options @@ -437,9 +437,9 @@ scrcpy --turn-screen-off scrcpy -S ``` -Or by pressing `Ctrl`+`o` at any time. +Or by pressing `RCtrl`+`o` at any time. -To turn it back on, press `Ctrl`+`Shift`+`o` (or `POWER`, `Ctrl`+`p`). +To turn it back on, press `RCtrl`+`Shift`+`o` (or `POWER`, `RCtrl`+`p`). It can be useful to also prevent the device to sleep: @@ -483,7 +483,7 @@ Note that it only shows _physical_ touches (with the finger on the device). #### Rotate device screen -Press `Ctrl`+`r` to switch between portrait and landscape modes. +Press `RCtrl`+`r` to switch between portrait and landscape modes. Note that it rotates only if the application in foreground supports the requested orientation. @@ -493,10 +493,10 @@ requested orientation. It is possible to synchronize clipboards between the computer and the device, in both directions: - - `Ctrl`+`c` copies the device clipboard to the computer clipboard; - - `Ctrl`+`Shift`+`v` copies the computer clipboard to the device clipboard (and - pastes if the device runs Android >= 7); - - `Ctrl`+`v` _pastes_ the computer clipboard as a sequence of text events (but + - `RCtrl`+`c` copies the device clipboard to the computer clipboard; + - `RCtrl`+`Shift`+`v` copies the computer clipboard to the device clipboard + (and pastes if the device runs Android >= 7); + - `RCtrl`+`v` _pastes_ the computer clipboard as a sequence of text events (but breaks non-ASCII characters). Moreover, any time the Android clipboard changes, it is automatically @@ -560,30 +560,33 @@ Also see [issue #14]. ## Shortcuts - | Action | Shortcut | Shortcut (macOS) - | ------------------------------------------- |:----------------------------- |:----------------------------- - | Switch fullscreen mode | `Ctrl`+`f` | `Cmd`+`f` - | Rotate display left | `Ctrl`+`←` _(left)_ | `Cmd`+`←` _(left)_ - | Rotate display right | `Ctrl`+`→` _(right)_ | `Cmd`+`→` _(right)_ - | Resize window to 1:1 (pixel-perfect) | `Ctrl`+`g` | `Cmd`+`g` - | Resize window to remove black borders | `Ctrl`+`x` \| _Double-click¹_ | `Cmd`+`x` \| _Double-click¹_ - | Click on `HOME` | `Ctrl`+`h` \| _Middle-click_ | `Ctrl`+`h` \| _Middle-click_ - | Click on `BACK` | `Ctrl`+`b` \| _Right-click²_ | `Cmd`+`b` \| _Right-click²_ - | Click on `APP_SWITCH` | `Ctrl`+`s` | `Cmd`+`s` - | Click on `MENU` | `Ctrl`+`m` | `Ctrl`+`m` - | Click on `VOLUME_UP` | `Ctrl`+`↑` _(up)_ | `Cmd`+`↑` _(up)_ - | Click on `VOLUME_DOWN` | `Ctrl`+`↓` _(down)_ | `Cmd`+`↓` _(down)_ - | Click on `POWER` | `Ctrl`+`p` | `Cmd`+`p` - | Power on | _Right-click²_ | _Right-click²_ - | Turn device screen off (keep mirroring) | `Ctrl`+`o` | `Cmd`+`o` - | Turn device screen on | `Ctrl`+`Shift`+`o` | `Cmd`+`Shift`+`o` - | Rotate device screen | `Ctrl`+`r` | `Cmd`+`r` - | Expand notification panel | `Ctrl`+`n` | `Cmd`+`n` - | Collapse notification panel | `Ctrl`+`Shift`+`n` | `Cmd`+`Shift`+`n` - | Copy device clipboard to computer | `Ctrl`+`c` | `Cmd`+`c` - | Paste computer clipboard to device | `Ctrl`+`v` | `Cmd`+`v` - | Copy computer clipboard to device and paste | `Ctrl`+`Shift`+`v` | `Cmd`+`Shift`+`v` - | Enable/disable FPS counter (on stdout) | `Ctrl`+`i` | `Cmd`+`i` +`RCtrl` is the right `Ctrl` key (the left `Ctrl` key is forwarded to the +device). + + | Action | Shortcut + | ------------------------------------------- |:----------------------------- + | Switch fullscreen mode | `RCtrl`+`f` + | Rotate display left | `RCtrl`+`←` + | Rotate display right | `RCtrl`+`→` + | Resize window to 1:1 (pixel-perfect) | `RCtrl`+`g` + | Resize window to remove black borders | `RCtrl`+`x` \| _Double-click¹_ + | Click on `HOME` | `RCtrl`+`h` \| _Middle-click_ + | Click on `BACK` | `RCtrl`+`b` \| _Right-click²_ + | Click on `APP_SWITCH` | `RCtrl`+`s` + | Click on `MENU` | `RCtrl`+`m` + | Click on `VOLUME_UP` | `RCtrl`+`↑` _(up)_ + | Click on `VOLUME_DOWN` | `RCtrl`+`↓` _(down)_ + | Click on `POWER` | `RCtrl`+`p` + | Power on | _Right-click²_ + | Turn device screen off (keep mirroring) | `RCtrl`+`o` + | Turn device screen on | `RCtrl`+`Shift`+`o` + | Rotate device screen | `RCtrl`+`r` + | Expand notification panel | `RCtrl`+`n` + | Collapse notification panel | `RCtrl`+`Shift`+`n` + | Copy device clipboard to computer | `RCtrl`+`c` + | Paste computer clipboard to device | `RCtrl`+`v` + | Copy computer clipboard to device and paste | `RCtrl`+`Shift`+`v` + | Enable/disable FPS counter (on stdout) | `RCtrl`+`i` _¹Double-click on black borders to remove them._ _²Right-click turns the screen on if it was off, presses BACK otherwise._ diff --git a/app/scrcpy.1 b/app/scrcpy.1 index 776d78ae..0f939c16 100644 --- a/app/scrcpy.1 +++ b/app/scrcpy.1 @@ -203,52 +203,54 @@ Default is 0 (automatic).\n .SH SHORTCUTS +RCtrl is the right Ctrl key (the left Ctrl key is forwarded to the device). + .TP -.B Ctrl+f +.B RCtrl+f Switch fullscreen mode .TP -.B Ctrl+Left +.B RCtrl+Left Rotate display left .TP -.B Ctrl+Right +.B RCtrl+Right Rotate display right .TP -.B Ctrl+g +.B RCtrl+g Resize window to 1:1 (pixel\-perfect) .TP -.B Ctrl+x, Double\-click on black borders +.B RCtrl+x, Double\-click on black borders Resize window to remove black borders .TP -.B Ctrl+h, Home, Middle\-click +.B RCtrl+h, Home, Middle\-click Click on HOME .TP -.B Ctrl+b, Ctrl+Backspace, Right\-click (when screen is on) +.B RCtrl+b, RCtrl+Backspace, Right\-click (when screen is on) Click on BACK .TP -.B Ctrl+s +.B RCtrl+s Click on APP_SWITCH .TP -.B Ctrl+m +.B RCtrl+m Click on MENU .TP -.B Ctrl+Up +.B RCtrl+Up Click on VOLUME_UP .TP -.B Ctrl+Down +.B RCtrl+Down Click on VOLUME_DOWN .TP -.B Ctrl+p +.B RCtrl+p Click on POWER (turn screen on/off) .TP @@ -256,39 +258,39 @@ Click on POWER (turn screen on/off) Turn screen on .TP -.B Ctrl+o +.B RCtrl+o Turn device screen off (keep mirroring) .TP -.B Ctrl+Shift+o +.B RCtrl+Shift+o Turn device screen on .TP -.B Ctrl+r +.B RCtrl+r Rotate device screen .TP -.B Ctrl+n +.B RCtrl+n Expand notification panel .TP -.B Ctrl+Shift+n +.B RCtrl+Shift+n Collapse notification panel .TP -.B Ctrl+c +.B RCtrl+c Copy device clipboard to computer .TP -.B Ctrl+v +.B RCtrl+v Paste computer clipboard to device .TP -.B Ctrl+Shift+v +.B RCtrl+Shift+v Copy computer clipboard to device (and paste if the device runs Android >= 7) .TP -.B Ctrl+i +.B RCtrl+i Enable/disable FPS counter (print frames/second in logs) .TP diff --git a/app/src/cli.c b/app/src/cli.c index be0b7c23..f6012ba9 100644 --- a/app/src/cli.c +++ b/app/src/cli.c @@ -12,11 +12,6 @@ void scrcpy_print_usage(const char *arg0) { -#ifdef __APPLE__ -# define CTRL_OR_CMD "Cmd" -#else -# define CTRL_OR_CMD "Ctrl" -#endif fprintf(stderr, "Usage: %s [options]\n" "\n" @@ -186,75 +181,78 @@ scrcpy_print_usage(const char *arg0) { "\n" "Shortcuts:\n" "\n" - " " CTRL_OR_CMD "+f\n" + " RCtrl is the right Ctrl key (the left Ctrl key is forwarded to\n" + " the device.\n" + "\n" + " RCtrl+f\n" " Switch fullscreen mode\n" "\n" - " " CTRL_OR_CMD "+Left\n" + " RCtrl+Left\n" " Rotate display left\n" "\n" - " " CTRL_OR_CMD "+Right\n" + " RCtrl+Right\n" " Rotate display right\n" "\n" - " " CTRL_OR_CMD "+g\n" + " RCtrl+g\n" " Resize window to 1:1 (pixel-perfect)\n" "\n" - " " CTRL_OR_CMD "+x\n" + " RCtrl+x\n" " Double-click on black borders\n" " Resize window to remove black borders\n" "\n" - " Ctrl+h\n" + " RCtrl+h\n" " Middle-click\n" " Click on HOME\n" "\n" - " " CTRL_OR_CMD "+b\n" - " " CTRL_OR_CMD "+Backspace\n" + " RCtrl+b\n" + " RCtrl+Backspace\n" " Right-click (when screen is on)\n" " Click on BACK\n" "\n" - " " CTRL_OR_CMD "+s\n" + " RCtrl+s\n" " Click on APP_SWITCH\n" "\n" - " Ctrl+m\n" + " RCtrl+m\n" " Click on MENU\n" "\n" - " " CTRL_OR_CMD "+Up\n" + " RCtrl+Up\n" " Click on VOLUME_UP\n" "\n" - " " CTRL_OR_CMD "+Down\n" + " RCtrl+Down\n" " Click on VOLUME_DOWN\n" "\n" - " " CTRL_OR_CMD "+p\n" + " RCtrl+p\n" " Click on POWER (turn screen on/off)\n" "\n" " Right-click (when screen is off)\n" " Power on\n" "\n" - " " CTRL_OR_CMD "+o\n" + " RCtrl+o\n" " Turn device screen off (keep mirroring)\n" "\n" - " " CTRL_OR_CMD "+Shift+o\n" + " RCtrl+Shift+o\n" " Turn device screen on\n" "\n" - " " CTRL_OR_CMD "+r\n" + " RCtrl+r\n" " Rotate device screen\n" "\n" - " " CTRL_OR_CMD "+n\n" + " RCtrl+n\n" " Expand notification panel\n" "\n" - " " CTRL_OR_CMD "+Shift+n\n" + " RCtrl+Shift+n\n" " Collapse notification panel\n" "\n" - " " CTRL_OR_CMD "+c\n" + " RCtrl+c\n" " Copy device clipboard to computer\n" "\n" - " " CTRL_OR_CMD "+v\n" + " RCtrl+v\n" " Paste computer clipboard to device\n" "\n" - " " CTRL_OR_CMD "+Shift+v\n" + " RCtrl+Shift+v\n" " Copy computer clipboard to device (and paste if the device\n" " runs Android >= 7)\n" "\n" - " " CTRL_OR_CMD "+i\n" + " RCtrl+i\n" " Enable/disable FPS counter (print frames/second in logs)\n" "\n" " Drag & drop APK file\n" diff --git a/app/src/input_manager.c b/app/src/input_manager.c index 54e619bf..4ba557f3 100644 --- a/app/src/input_manager.c +++ b/app/src/input_manager.c @@ -259,31 +259,21 @@ input_manager_process_key(struct input_manager *im, // control: indicates the state of the command-line option --no-control // ctrl: the Ctrl key - bool ctrl = event->keysym.mod & (KMOD_LCTRL | KMOD_RCTRL); + bool lctrl = event->keysym.mod & KMOD_LCTRL; + bool rctrl = event->keysym.mod & KMOD_RCTRL; bool alt = event->keysym.mod & (KMOD_LALT | KMOD_RALT); bool meta = event->keysym.mod & (KMOD_LGUI | KMOD_RGUI); - // use Cmd on macOS, Ctrl on other platforms -#ifdef __APPLE__ - bool cmd = !ctrl && meta; -#else - if (meta) { - // no shortcuts involve Meta on platforms other than macOS, and it must - // not be forwarded to the device - return; - } - bool cmd = ctrl; // && !meta, already guaranteed -#endif - - if (alt) { - // no shortcuts involve Alt, and it must not be forwarded to the device + if (alt || lctrl || meta) { + // No shortcuts involve Alt, Meta or LCtrl, and they are not forwarded + // to the device return; } struct controller *controller = im->controller; - // capture all Ctrl events - if (ctrl || cmd) { + // Capture all RCtrl events + if (rctrl) { SDL_Keycode keycode = event->keysym.sym; bool down = event->type == SDL_KEYDOWN; int action = down ? ACTION_DOWN : ACTION_UP; @@ -293,35 +283,35 @@ input_manager_process_key(struct input_manager *im, case SDLK_h: // Ctrl+h on all platform, since Cmd+h is already captured by // the system on macOS to hide the window - if (control && ctrl && !meta && !shift && !repeat) { + if (control && !shift && !repeat) { action_home(controller, action); } return; case SDLK_b: // fall-through case SDLK_BACKSPACE: - if (control && cmd && !shift && !repeat) { + if (control && !shift && !repeat) { action_back(controller, action); } return; case SDLK_s: - if (control && cmd && !shift && !repeat) { + if (control && !shift && !repeat) { action_app_switch(controller, action); } return; case SDLK_m: // Ctrl+m on all platform, since Cmd+m is already captured by // the system on macOS to minimize the window - if (control && ctrl && !meta && !shift && !repeat) { + if (control && !shift && !repeat) { action_menu(controller, action); } return; case SDLK_p: - if (control && cmd && !shift && !repeat) { + if (control && !shift && !repeat) { action_power(controller, action); } return; case SDLK_o: - if (control && cmd && !repeat && down) { + if (control && !repeat && down) { enum screen_power_mode mode = shift ? SCREEN_POWER_MODE_NORMAL : SCREEN_POWER_MODE_OFF; @@ -329,34 +319,34 @@ input_manager_process_key(struct input_manager *im, } return; case SDLK_DOWN: - if (control && cmd && !shift) { + if (control && !shift) { // forward repeated events action_volume_down(controller, action); } return; case SDLK_UP: - if (control && cmd && !shift) { + if (control && !shift) { // forward repeated events action_volume_up(controller, action); } return; case SDLK_LEFT: - if (cmd && !shift && !repeat && down) { + if (!shift && !repeat && down) { rotate_client_left(im->screen); } return; case SDLK_RIGHT: - if (cmd && !shift && !repeat && down) { + if (!shift && !repeat && down) { rotate_client_right(im->screen); } return; case SDLK_c: - if (control && cmd && !shift && !repeat && down) { + if (control && !shift && !repeat && down) { request_device_clipboard(controller); } return; case SDLK_v: - if (control && cmd && !repeat && down) { + if (control && !repeat && down) { if (shift) { // store the text in the device clipboard and paste set_device_clipboard(controller, true); @@ -367,29 +357,29 @@ input_manager_process_key(struct input_manager *im, } return; case SDLK_f: - if (!shift && cmd && !repeat && down) { + if (!shift && !repeat && down) { screen_switch_fullscreen(im->screen); } return; case SDLK_x: - if (!shift && cmd && !repeat && down) { + if (!shift && !repeat && down) { screen_resize_to_fit(im->screen); } return; case SDLK_g: - if (!shift && cmd && !repeat && down) { + if (!shift && !repeat && down) { screen_resize_to_pixel_perfect(im->screen); } return; case SDLK_i: - if (!shift && cmd && !repeat && down) { + if (!shift && !repeat && down) { struct fps_counter *fps_counter = im->video_buffer->fps_counter; switch_fps_counter_state(fps_counter); } return; case SDLK_n: - if (control && cmd && !repeat && down) { + if (control && !repeat && down) { if (shift) { collapse_notification_panel(controller); } else { @@ -398,7 +388,7 @@ input_manager_process_key(struct input_manager *im, } return; case SDLK_r: - if (control && cmd && !shift && !repeat && down) { + if (control && !shift && !repeat && down) { rotate_device(controller); } return;