Only use RCtrl for scrcpy shortcuts

This paves the way to forward LCtrl to the device.
This commit is contained in:
Romain Vimont 2020-06-01 15:23:46 +02:00
parent 6e1069a822
commit fbd2d0bf3e
4 changed files with 113 additions and 120 deletions

View file

@ -354,7 +354,7 @@ scrcpy --fullscreen
scrcpy -f # short version scrcpy -f # short version
``` ```
Fullscreen can then be toggled dynamically with `Ctrl`+`f`. Fullscreen can then be toggled dynamically with `RCtrl`+`f`.
#### Rotation #### Rotation
@ -370,18 +370,18 @@ Possibles values are:
- `2`: 180 degrees - `2`: 180 degrees
- `3`: 90 degrees clockwise - `3`: 90 degrees clockwise
The rotation can also be changed dynamically with `Ctrl`+`←` _(left)_ and The rotation can also be changed dynamically with `RCtrl`+`←` _(left)_ and
`Ctrl`+`→` _(right)_. `RCtrl`+`→` _(right)_.
Note that _scrcpy_ manages 3 different rotations: 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 current running app may refuse, if it does support the requested
orientation). orientation).
- `--lock-video-orientation` changes the mirroring orientation (the orientation - `--lock-video-orientation` changes the mirroring orientation (the orientation
of the video sent from the device to the computer). This affects the of the video sent from the device to the computer). This affects the
recording. recording.
- `--rotation` (or `Ctrl`+`←`/`Ctrl`+`→`) rotates only the window content. This - `--rotation` (or `RCtrl`+`←`/`RCtrl`+`→`) rotates only the window content.
affects only the display, not the recording. This affects only the display, not the recording.
### Other mirroring options ### Other mirroring options
@ -437,9 +437,9 @@ scrcpy --turn-screen-off
scrcpy -S 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: 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 #### 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 Note that it rotates only if the application in foreground supports the
requested orientation. requested orientation.
@ -493,10 +493,10 @@ requested orientation.
It is possible to synchronize clipboards between the computer and the device, in It is possible to synchronize clipboards between the computer and the device, in
both directions: both directions:
- `Ctrl`+`c` copies the device clipboard to the computer clipboard; - `RCtrl`+`c` copies the device clipboard to the computer clipboard;
- `Ctrl`+`Shift`+`v` copies the computer clipboard to the device clipboard (and - `RCtrl`+`Shift`+`v` copies the computer clipboard to the device clipboard
pastes if the device runs Android >= 7); (and pastes if the device runs Android >= 7);
- `Ctrl`+`v` _pastes_ the computer clipboard as a sequence of text events (but - `RCtrl`+`v` _pastes_ the computer clipboard as a sequence of text events (but
breaks non-ASCII characters). breaks non-ASCII characters).
Moreover, any time the Android clipboard changes, it is automatically Moreover, any time the Android clipboard changes, it is automatically
@ -560,30 +560,33 @@ Also see [issue #14].
## Shortcuts ## Shortcuts
| Action | Shortcut | Shortcut (macOS) `RCtrl` is the right `Ctrl` key (the left `Ctrl` key is forwarded to the
| ------------------------------------------- |:----------------------------- |:----------------------------- device).
| Switch fullscreen mode | `Ctrl`+`f` | `Cmd`+`f`
| Rotate display left | `Ctrl`+`←` _(left)_ | `Cmd`+`←` _(left)_ | Action | Shortcut
| Rotate display right | `Ctrl`+`→` _(right)_ | `Cmd`+`→` _(right)_ | ------------------------------------------- |:-----------------------------
| Resize window to 1:1 (pixel-perfect) | `Ctrl`+`g` | `Cmd`+`g` | Switch fullscreen mode | `RCtrl`+`f`
| Resize window to remove black borders | `Ctrl`+`x` \| _Double-click¹_ | `Cmd`+`x` \| _Double-click¹_ | Rotate display left | `RCtrl`+`←`
| Click on `HOME` | `Ctrl`+`h` \| _Middle-click_ | `Ctrl`+`h` \| _Middle-click_ | Rotate display right | `RCtrl`+`→`
| Click on `BACK` | `Ctrl`+`b` \| _Right-click²_ | `Cmd`+`b` \| _Right-click²_ | Resize window to 1:1 (pixel-perfect) | `RCtrl`+`g`
| Click on `APP_SWITCH` | `Ctrl`+`s` | `Cmd`+`s` | Resize window to remove black borders | `RCtrl`+`x` \| _Double-click¹_
| Click on `MENU` | `Ctrl`+`m` | `Ctrl`+`m` | Click on `HOME` | `RCtrl`+`h` \| _Middle-click_
| Click on `VOLUME_UP` | `Ctrl`+`↑` _(up)_ | `Cmd`+`↑` _(up)_ | Click on `BACK` | `RCtrl`+`b` \| _Right-click²_
| Click on `VOLUME_DOWN` | `Ctrl`+`↓` _(down)_ | `Cmd`+`↓` _(down)_ | Click on `APP_SWITCH` | `RCtrl`+`s`
| Click on `POWER` | `Ctrl`+`p` | `Cmd`+`p` | Click on `MENU` | `RCtrl`+`m`
| Power on | _Right-click²_ | _Right-click²_ | Click on `VOLUME_UP` | `RCtrl`+`↑` _(up)_
| Turn device screen off (keep mirroring) | `Ctrl`+`o` | `Cmd`+`o` | Click on `VOLUME_DOWN` | `RCtrl`+`↓` _(down)_
| Turn device screen on | `Ctrl`+`Shift`+`o` | `Cmd`+`Shift`+`o` | Click on `POWER` | `RCtrl`+`p`
| Rotate device screen | `Ctrl`+`r` | `Cmd`+`r` | Power on | _Right-click²_
| Expand notification panel | `Ctrl`+`n` | `Cmd`+`n` | Turn device screen off (keep mirroring) | `RCtrl`+`o`
| Collapse notification panel | `Ctrl`+`Shift`+`n` | `Cmd`+`Shift`+`n` | Turn device screen on | `RCtrl`+`Shift`+`o`
| Copy device clipboard to computer | `Ctrl`+`c` | `Cmd`+`c` | Rotate device screen | `RCtrl`+`r`
| Paste computer clipboard to device | `Ctrl`+`v` | `Cmd`+`v` | Expand notification panel | `RCtrl`+`n`
| Copy computer clipboard to device and paste | `Ctrl`+`Shift`+`v` | `Cmd`+`Shift`+`v` | Collapse notification panel | `RCtrl`+`Shift`+`n`
| Enable/disable FPS counter (on stdout) | `Ctrl`+`i` | `Cmd`+`i` | 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._ _¹Double-click on black borders to remove them._
_²Right-click turns the screen on if it was off, presses BACK otherwise._ _²Right-click turns the screen on if it was off, presses BACK otherwise._

View file

@ -203,52 +203,54 @@ Default is 0 (automatic).\n
.SH SHORTCUTS .SH SHORTCUTS
RCtrl is the right Ctrl key (the left Ctrl key is forwarded to the device).
.TP .TP
.B Ctrl+f .B RCtrl+f
Switch fullscreen mode Switch fullscreen mode
.TP .TP
.B Ctrl+Left .B RCtrl+Left
Rotate display left Rotate display left
.TP .TP
.B Ctrl+Right .B RCtrl+Right
Rotate display right Rotate display right
.TP .TP
.B Ctrl+g .B RCtrl+g
Resize window to 1:1 (pixel\-perfect) Resize window to 1:1 (pixel\-perfect)
.TP .TP
.B Ctrl+x, Double\-click on black borders .B RCtrl+x, Double\-click on black borders
Resize window to remove black borders Resize window to remove black borders
.TP .TP
.B Ctrl+h, Home, Middle\-click .B RCtrl+h, Home, Middle\-click
Click on HOME Click on HOME
.TP .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 Click on BACK
.TP .TP
.B Ctrl+s .B RCtrl+s
Click on APP_SWITCH Click on APP_SWITCH
.TP .TP
.B Ctrl+m .B RCtrl+m
Click on MENU Click on MENU
.TP .TP
.B Ctrl+Up .B RCtrl+Up
Click on VOLUME_UP Click on VOLUME_UP
.TP .TP
.B Ctrl+Down .B RCtrl+Down
Click on VOLUME_DOWN Click on VOLUME_DOWN
.TP .TP
.B Ctrl+p .B RCtrl+p
Click on POWER (turn screen on/off) Click on POWER (turn screen on/off)
.TP .TP
@ -256,39 +258,39 @@ Click on POWER (turn screen on/off)
Turn screen on Turn screen on
.TP .TP
.B Ctrl+o .B RCtrl+o
Turn device screen off (keep mirroring) Turn device screen off (keep mirroring)
.TP .TP
.B Ctrl+Shift+o .B RCtrl+Shift+o
Turn device screen on Turn device screen on
.TP .TP
.B Ctrl+r .B RCtrl+r
Rotate device screen Rotate device screen
.TP .TP
.B Ctrl+n .B RCtrl+n
Expand notification panel Expand notification panel
.TP .TP
.B Ctrl+Shift+n .B RCtrl+Shift+n
Collapse notification panel Collapse notification panel
.TP .TP
.B Ctrl+c .B RCtrl+c
Copy device clipboard to computer Copy device clipboard to computer
.TP .TP
.B Ctrl+v .B RCtrl+v
Paste computer clipboard to device Paste computer clipboard to device
.TP .TP
.B Ctrl+Shift+v .B RCtrl+Shift+v
Copy computer clipboard to device (and paste if the device runs Android >= 7) Copy computer clipboard to device (and paste if the device runs Android >= 7)
.TP .TP
.B Ctrl+i .B RCtrl+i
Enable/disable FPS counter (print frames/second in logs) Enable/disable FPS counter (print frames/second in logs)
.TP .TP

View file

@ -12,11 +12,6 @@
void void
scrcpy_print_usage(const char *arg0) { scrcpy_print_usage(const char *arg0) {
#ifdef __APPLE__
# define CTRL_OR_CMD "Cmd"
#else
# define CTRL_OR_CMD "Ctrl"
#endif
fprintf(stderr, fprintf(stderr,
"Usage: %s [options]\n" "Usage: %s [options]\n"
"\n" "\n"
@ -186,75 +181,78 @@ scrcpy_print_usage(const char *arg0) {
"\n" "\n"
"Shortcuts:\n" "Shortcuts:\n"
"\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" " Switch fullscreen mode\n"
"\n" "\n"
" " CTRL_OR_CMD "+Left\n" " RCtrl+Left\n"
" Rotate display left\n" " Rotate display left\n"
"\n" "\n"
" " CTRL_OR_CMD "+Right\n" " RCtrl+Right\n"
" Rotate display right\n" " Rotate display right\n"
"\n" "\n"
" " CTRL_OR_CMD "+g\n" " RCtrl+g\n"
" Resize window to 1:1 (pixel-perfect)\n" " Resize window to 1:1 (pixel-perfect)\n"
"\n" "\n"
" " CTRL_OR_CMD "+x\n" " RCtrl+x\n"
" Double-click on black borders\n" " Double-click on black borders\n"
" Resize window to remove black borders\n" " Resize window to remove black borders\n"
"\n" "\n"
" Ctrl+h\n" " RCtrl+h\n"
" Middle-click\n" " Middle-click\n"
" Click on HOME\n" " Click on HOME\n"
"\n" "\n"
" " CTRL_OR_CMD "+b\n" " RCtrl+b\n"
" " CTRL_OR_CMD "+Backspace\n" " RCtrl+Backspace\n"
" Right-click (when screen is on)\n" " Right-click (when screen is on)\n"
" Click on BACK\n" " Click on BACK\n"
"\n" "\n"
" " CTRL_OR_CMD "+s\n" " RCtrl+s\n"
" Click on APP_SWITCH\n" " Click on APP_SWITCH\n"
"\n" "\n"
" Ctrl+m\n" " RCtrl+m\n"
" Click on MENU\n" " Click on MENU\n"
"\n" "\n"
" " CTRL_OR_CMD "+Up\n" " RCtrl+Up\n"
" Click on VOLUME_UP\n" " Click on VOLUME_UP\n"
"\n" "\n"
" " CTRL_OR_CMD "+Down\n" " RCtrl+Down\n"
" Click on VOLUME_DOWN\n" " Click on VOLUME_DOWN\n"
"\n" "\n"
" " CTRL_OR_CMD "+p\n" " RCtrl+p\n"
" Click on POWER (turn screen on/off)\n" " Click on POWER (turn screen on/off)\n"
"\n" "\n"
" Right-click (when screen is off)\n" " Right-click (when screen is off)\n"
" Power on\n" " Power on\n"
"\n" "\n"
" " CTRL_OR_CMD "+o\n" " RCtrl+o\n"
" Turn device screen off (keep mirroring)\n" " Turn device screen off (keep mirroring)\n"
"\n" "\n"
" " CTRL_OR_CMD "+Shift+o\n" " RCtrl+Shift+o\n"
" Turn device screen on\n" " Turn device screen on\n"
"\n" "\n"
" " CTRL_OR_CMD "+r\n" " RCtrl+r\n"
" Rotate device screen\n" " Rotate device screen\n"
"\n" "\n"
" " CTRL_OR_CMD "+n\n" " RCtrl+n\n"
" Expand notification panel\n" " Expand notification panel\n"
"\n" "\n"
" " CTRL_OR_CMD "+Shift+n\n" " RCtrl+Shift+n\n"
" Collapse notification panel\n" " Collapse notification panel\n"
"\n" "\n"
" " CTRL_OR_CMD "+c\n" " RCtrl+c\n"
" Copy device clipboard to computer\n" " Copy device clipboard to computer\n"
"\n" "\n"
" " CTRL_OR_CMD "+v\n" " RCtrl+v\n"
" Paste computer clipboard to device\n" " Paste computer clipboard to device\n"
"\n" "\n"
" " CTRL_OR_CMD "+Shift+v\n" " RCtrl+Shift+v\n"
" Copy computer clipboard to device (and paste if the device\n" " Copy computer clipboard to device (and paste if the device\n"
" runs Android >= 7)\n" " runs Android >= 7)\n"
"\n" "\n"
" " CTRL_OR_CMD "+i\n" " RCtrl+i\n"
" Enable/disable FPS counter (print frames/second in logs)\n" " Enable/disable FPS counter (print frames/second in logs)\n"
"\n" "\n"
" Drag & drop APK file\n" " Drag & drop APK file\n"

View file

@ -259,31 +259,21 @@ input_manager_process_key(struct input_manager *im,
// control: indicates the state of the command-line option --no-control // control: indicates the state of the command-line option --no-control
// ctrl: the Ctrl key // 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 alt = event->keysym.mod & (KMOD_LALT | KMOD_RALT);
bool meta = event->keysym.mod & (KMOD_LGUI | KMOD_RGUI); bool meta = event->keysym.mod & (KMOD_LGUI | KMOD_RGUI);
// use Cmd on macOS, Ctrl on other platforms if (alt || lctrl || meta) {
#ifdef __APPLE__ // No shortcuts involve Alt, Meta or LCtrl, and they are not forwarded
bool cmd = !ctrl && meta; // to the device
#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
return; return;
} }
struct controller *controller = im->controller; struct controller *controller = im->controller;
// capture all Ctrl events // Capture all RCtrl events
if (ctrl || cmd) { if (rctrl) {
SDL_Keycode keycode = event->keysym.sym; SDL_Keycode keycode = event->keysym.sym;
bool down = event->type == SDL_KEYDOWN; bool down = event->type == SDL_KEYDOWN;
int action = down ? ACTION_DOWN : ACTION_UP; int action = down ? ACTION_DOWN : ACTION_UP;
@ -293,35 +283,35 @@ input_manager_process_key(struct input_manager *im,
case SDLK_h: case SDLK_h:
// Ctrl+h on all platform, since Cmd+h is already captured by // Ctrl+h on all platform, since Cmd+h is already captured by
// the system on macOS to hide the window // the system on macOS to hide the window
if (control && ctrl && !meta && !shift && !repeat) { if (control && !shift && !repeat) {
action_home(controller, action); action_home(controller, action);
} }
return; return;
case SDLK_b: // fall-through case SDLK_b: // fall-through
case SDLK_BACKSPACE: case SDLK_BACKSPACE:
if (control && cmd && !shift && !repeat) { if (control && !shift && !repeat) {
action_back(controller, action); action_back(controller, action);
} }
return; return;
case SDLK_s: case SDLK_s:
if (control && cmd && !shift && !repeat) { if (control && !shift && !repeat) {
action_app_switch(controller, action); action_app_switch(controller, action);
} }
return; return;
case SDLK_m: case SDLK_m:
// Ctrl+m on all platform, since Cmd+m is already captured by // Ctrl+m on all platform, since Cmd+m is already captured by
// the system on macOS to minimize the window // the system on macOS to minimize the window
if (control && ctrl && !meta && !shift && !repeat) { if (control && !shift && !repeat) {
action_menu(controller, action); action_menu(controller, action);
} }
return; return;
case SDLK_p: case SDLK_p:
if (control && cmd && !shift && !repeat) { if (control && !shift && !repeat) {
action_power(controller, action); action_power(controller, action);
} }
return; return;
case SDLK_o: case SDLK_o:
if (control && cmd && !repeat && down) { if (control && !repeat && down) {
enum screen_power_mode mode = shift enum screen_power_mode mode = shift
? SCREEN_POWER_MODE_NORMAL ? SCREEN_POWER_MODE_NORMAL
: SCREEN_POWER_MODE_OFF; : SCREEN_POWER_MODE_OFF;
@ -329,34 +319,34 @@ input_manager_process_key(struct input_manager *im,
} }
return; return;
case SDLK_DOWN: case SDLK_DOWN:
if (control && cmd && !shift) { if (control && !shift) {
// forward repeated events // forward repeated events
action_volume_down(controller, action); action_volume_down(controller, action);
} }
return; return;
case SDLK_UP: case SDLK_UP:
if (control && cmd && !shift) { if (control && !shift) {
// forward repeated events // forward repeated events
action_volume_up(controller, action); action_volume_up(controller, action);
} }
return; return;
case SDLK_LEFT: case SDLK_LEFT:
if (cmd && !shift && !repeat && down) { if (!shift && !repeat && down) {
rotate_client_left(im->screen); rotate_client_left(im->screen);
} }
return; return;
case SDLK_RIGHT: case SDLK_RIGHT:
if (cmd && !shift && !repeat && down) { if (!shift && !repeat && down) {
rotate_client_right(im->screen); rotate_client_right(im->screen);
} }
return; return;
case SDLK_c: case SDLK_c:
if (control && cmd && !shift && !repeat && down) { if (control && !shift && !repeat && down) {
request_device_clipboard(controller); request_device_clipboard(controller);
} }
return; return;
case SDLK_v: case SDLK_v:
if (control && cmd && !repeat && down) { if (control && !repeat && down) {
if (shift) { if (shift) {
// store the text in the device clipboard and paste // store the text in the device clipboard and paste
set_device_clipboard(controller, true); set_device_clipboard(controller, true);
@ -367,29 +357,29 @@ input_manager_process_key(struct input_manager *im,
} }
return; return;
case SDLK_f: case SDLK_f:
if (!shift && cmd && !repeat && down) { if (!shift && !repeat && down) {
screen_switch_fullscreen(im->screen); screen_switch_fullscreen(im->screen);
} }
return; return;
case SDLK_x: case SDLK_x:
if (!shift && cmd && !repeat && down) { if (!shift && !repeat && down) {
screen_resize_to_fit(im->screen); screen_resize_to_fit(im->screen);
} }
return; return;
case SDLK_g: case SDLK_g:
if (!shift && cmd && !repeat && down) { if (!shift && !repeat && down) {
screen_resize_to_pixel_perfect(im->screen); screen_resize_to_pixel_perfect(im->screen);
} }
return; return;
case SDLK_i: case SDLK_i:
if (!shift && cmd && !repeat && down) { if (!shift && !repeat && down) {
struct fps_counter *fps_counter = struct fps_counter *fps_counter =
im->video_buffer->fps_counter; im->video_buffer->fps_counter;
switch_fps_counter_state(fps_counter); switch_fps_counter_state(fps_counter);
} }
return; return;
case SDLK_n: case SDLK_n:
if (control && cmd && !repeat && down) { if (control && !repeat && down) {
if (shift) { if (shift) {
collapse_notification_panel(controller); collapse_notification_panel(controller);
} else { } else {
@ -398,7 +388,7 @@ input_manager_process_key(struct input_manager *im,
} }
return; return;
case SDLK_r: case SDLK_r:
if (control && cmd && !shift && !repeat && down) { if (control && !shift && !repeat && down) {
rotate_device(controller); rotate_device(controller);
} }
return; return;