From d009f13e7c489016c494ba3a80bedded1e3bbeab Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Fri, 29 May 2020 22:13:25 +0200 Subject: [PATCH] Replace Ctrl by Meta as shortcut modifier This paves the way to forward Ctrl to the device. --- README.md | 44 +++++++++++++++-------------- app/scrcpy.1 | 42 ++++++++++++++-------------- app/src/cli.c | 45 +++++++++++++++--------------- app/src/input_manager.c | 61 ++++++++++++++++------------------------- 4 files changed, 90 insertions(+), 102 deletions(-) diff --git a/README.md b/README.md index fe7f0fac54..a914f4fd75 100644 --- a/README.md +++ b/README.md @@ -560,30 +560,32 @@ Also see [issue #14]. ## Shortcuts +_`Meta` is typically the `Windows` key on the keyboard._ + | 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` + | Switch fullscreen mode | `Meta`+`f` | `Cmd`+`f` + | Rotate display left | `Meta`+`←` _(left)_ | `Cmd`+`←` _(left)_ + | Rotate display right | `Meta`+`→` _(right)_ | `Cmd`+`→` _(right)_ + | Resize window to 1:1 (pixel-perfect) | `Meta`+`g` | `Cmd`+`g` + | Resize window to remove black borders | `Meta`+`x` \| _Double-click¹_ | `Cmd`+`x` \| _Double-click¹_ + | Click on `HOME` | `Meta`+`h` \| _Middle-click_ | `Cmd`+`h` \| _Middle-click_ + | Click on `BACK` | `Meta`+`b` \| _Right-click²_ | `Cmd`+`b` \| _Right-click²_ + | Click on `APP_SWITCH` | `Meta`+`s` | `Cmd`+`s` + | Click on `MENU` | `Meta`+`m` | `Cmd`+`m` + | Click on `VOLUME_UP` | `Meta`+`↑` _(up)_ | `Cmd`+`↑` _(up)_ + | Click on `VOLUME_DOWN` | `Meta`+`↓` _(down)_ | `Cmd`+`↓` _(down)_ + | Click on `POWER` | `Meta`+`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` + | Turn device screen off (keep mirroring) | `Meta`+`o` | `Cmd`+`o` + | Turn device screen on | `Meta`+`Shift`+`o` | `Cmd`+`Shift`+`o` + | Rotate device screen | `Meta`+`r` | `Cmd`+`r` + | Expand notification panel | `Meta`+`n` | `Cmd`+`n` + | Collapse notification panel | `Meta`+`Shift`+`n` | `Cmd`+`Shift`+`n` + | Copy device clipboard to computer | `Meta`+`c` | `Cmd`+`c` + | Paste computer clipboard to device | `Meta`+`v` | `Cmd`+`v` + | Copy computer clipboard to device and paste | `Meta`+`Shift`+`v` | `Cmd`+`Shift`+`v` + | Enable/disable FPS counter (on stdout) | `Meta`+`i` | `Cmd`+`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 776d78ae85..53dbb37760 100644 --- a/app/scrcpy.1 +++ b/app/scrcpy.1 @@ -204,51 +204,51 @@ Default is 0 (automatic).\n .SH SHORTCUTS .TP -.B Ctrl+f +.B Meta+f Switch fullscreen mode .TP -.B Ctrl+Left +.B Meta+Left Rotate display left .TP -.B Ctrl+Right +.B Meta+Right Rotate display right .TP -.B Ctrl+g +.B Meta+g Resize window to 1:1 (pixel\-perfect) .TP -.B Ctrl+x, Double\-click on black borders +.B Meta+x, Double\-click on black borders Resize window to remove black borders .TP -.B Ctrl+h, Home, Middle\-click +.B Meta+h, Home, Middle\-click Click on HOME .TP -.B Ctrl+b, Ctrl+Backspace, Right\-click (when screen is on) +.B Meta+b, Meta+Backspace, Right\-click (when screen is on) Click on BACK .TP -.B Ctrl+s +.B Meta+s Click on APP_SWITCH .TP -.B Ctrl+m +.B Meta+m Click on MENU .TP -.B Ctrl+Up +.B Meta+Up Click on VOLUME_UP .TP -.B Ctrl+Down +.B Meta+Down Click on VOLUME_DOWN .TP -.B Ctrl+p +.B Meta+p Click on POWER (turn screen on/off) .TP @@ -256,39 +256,39 @@ Click on POWER (turn screen on/off) Turn screen on .TP -.B Ctrl+o +.B Meta+o Turn device screen off (keep mirroring) .TP -.B Ctrl+Shift+o +.B Meta+Shift+o Turn device screen on .TP -.B Ctrl+r +.B Meta+r Rotate device screen .TP -.B Ctrl+n +.B Meta+n Expand notification panel .TP -.B Ctrl+Shift+n +.B Meta+Shift+n Collapse notification panel .TP -.B Ctrl+c +.B Meta+c Copy device clipboard to computer .TP -.B Ctrl+v +.B Meta+v Paste computer clipboard to device .TP -.B Ctrl+Shift+v +.B Meta+Shift+v Copy computer clipboard to device (and paste if the device runs Android >= 7) .TP -.B Ctrl+i +.B Meta+i Enable/disable FPS counter (print frames/second in logs) .TP diff --git a/app/src/cli.c b/app/src/cli.c index be0b7c238c..2f4b2cf30a 100644 --- a/app/src/cli.c +++ b/app/src/cli.c @@ -13,9 +13,9 @@ void scrcpy_print_usage(const char *arg0) { #ifdef __APPLE__ -# define CTRL_OR_CMD "Cmd" +# define MOD "Cmd" #else -# define CTRL_OR_CMD "Ctrl" +# define MOD "Meta" #endif fprintf(stderr, "Usage: %s [options]\n" @@ -186,19 +186,19 @@ scrcpy_print_usage(const char *arg0) { "\n" "Shortcuts:\n" "\n" - " " CTRL_OR_CMD "+f\n" + " " MOD "+f\n" " Switch fullscreen mode\n" "\n" - " " CTRL_OR_CMD "+Left\n" + " " MOD "+Left\n" " Rotate display left\n" "\n" - " " CTRL_OR_CMD "+Right\n" + " " MOD "+Right\n" " Rotate display right\n" "\n" - " " CTRL_OR_CMD "+g\n" + " " MOD "+g\n" " Resize window to 1:1 (pixel-perfect)\n" "\n" - " " CTRL_OR_CMD "+x\n" + " " MOD "+x\n" " Double-click on black borders\n" " Resize window to remove black borders\n" "\n" @@ -206,55 +206,55 @@ scrcpy_print_usage(const char *arg0) { " Middle-click\n" " Click on HOME\n" "\n" - " " CTRL_OR_CMD "+b\n" - " " CTRL_OR_CMD "+Backspace\n" + " " MOD "+b\n" + " " MOD "+Backspace\n" " Right-click (when screen is on)\n" " Click on BACK\n" "\n" - " " CTRL_OR_CMD "+s\n" + " " MOD "+s\n" " Click on APP_SWITCH\n" "\n" " Ctrl+m\n" " Click on MENU\n" "\n" - " " CTRL_OR_CMD "+Up\n" + " " MOD "+Up\n" " Click on VOLUME_UP\n" "\n" - " " CTRL_OR_CMD "+Down\n" + " " MOD "+Down\n" " Click on VOLUME_DOWN\n" "\n" - " " CTRL_OR_CMD "+p\n" + " " MOD "+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" + " " MOD "+o\n" " Turn device screen off (keep mirroring)\n" "\n" - " " CTRL_OR_CMD "+Shift+o\n" + " " MOD "+Shift+o\n" " Turn device screen on\n" "\n" - " " CTRL_OR_CMD "+r\n" + " " MOD "+r\n" " Rotate device screen\n" "\n" - " " CTRL_OR_CMD "+n\n" + " " MOD "+n\n" " Expand notification panel\n" "\n" - " " CTRL_OR_CMD "+Shift+n\n" + " " MOD "+Shift+n\n" " Collapse notification panel\n" "\n" - " " CTRL_OR_CMD "+c\n" + " " MOD "+c\n" " Copy device clipboard to computer\n" "\n" - " " CTRL_OR_CMD "+v\n" + " " MOD "+v\n" " Paste computer clipboard to device\n" "\n" - " " CTRL_OR_CMD "+Shift+v\n" + " " MOD "+Shift+v\n" " Copy computer clipboard to device (and paste if the device\n" " runs Android >= 7)\n" "\n" - " " CTRL_OR_CMD "+i\n" + " " MOD "+i\n" " Enable/disable FPS counter (print frames/second in logs)\n" "\n" " Drag & drop APK file\n" @@ -265,6 +265,7 @@ scrcpy_print_usage(const char *arg0) { DEFAULT_LOCK_VIDEO_ORIENTATION, DEFAULT_LOCK_VIDEO_ORIENTATION >= 0 ? "" : " (unlocked)", DEFAULT_MAX_SIZE, DEFAULT_MAX_SIZE ? "" : " (unlimited)", DEFAULT_LOCAL_PORT_RANGE_FIRST, DEFAULT_LOCAL_PORT_RANGE_LAST); +#undef MOD } static bool diff --git a/app/src/input_manager.c b/app/src/input_manager.c index 54e619bf11..a8c5aa4529 100644 --- a/app/src/input_manager.c +++ b/app/src/input_manager.c @@ -263,27 +263,16 @@ input_manager_process_key(struct input_manager *im, 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 || ctrl) { + // No shortcuts involve Alt or Ctrl, and they are not forwarded to the + // device return; } struct controller *controller = im->controller; - // capture all Ctrl events - if (ctrl || cmd) { + // Capture all Meta events + if (meta) { SDL_Keycode keycode = event->keysym.sym; bool down = event->type == SDL_KEYDOWN; int action = down ? ACTION_DOWN : ACTION_UP; @@ -291,37 +280,33 @@ input_manager_process_key(struct input_manager *im, bool shift = event->keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT); switch (keycode) { 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 +314,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 +352,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 +383,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;