From e2ac996183c661a1887ae225c81b624551cc0299 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Wed, 31 Jul 2019 16:11:08 +0200 Subject: [PATCH] Use Cmd instead of Ctrl on macOS when possible Fixes --- README.md | 40 +++++++++++++++--------------- app/src/input_manager.c | 55 +++++++++++++++++++++++------------------ app/src/main.c | 37 +++++++++++++++------------ 3 files changed, 72 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index 25d600c3..c1967343 100644 --- a/README.md +++ b/README.md @@ -315,26 +315,26 @@ Also see [issue #14]. ## Shortcuts - | Action | Shortcut | - | -------------------------------------- |:---------------------------- | - | Switch fullscreen mode | `Ctrl`+`f` | - | Resize window to 1:1 (pixel-perfect) | `Ctrl`+`g` | - | Resize window to remove black borders | `Ctrl`+`x` \| _Double-click¹_ | - | Click on `HOME` | `Ctrl`+`h` \| _Middle-click_ | - | Click on `BACK` | `Ctrl`+`b` \| _Right-click²_ | - | Click on `APP_SWITCH` | `Ctrl`+`s` | - | Click on `MENU` | `Ctrl`+`m` | - | Click on `VOLUME_UP` | `Ctrl`+`↑` _(up)_ (`Cmd`+`↑` on macOS) | - | Click on `VOLUME_DOWN` | `Ctrl`+`↓` _(down)_ (`Cmd`+`↓` on macOS) | - | Click on `POWER` | `Ctrl`+`p` | - | Power on | _Right-click²_ | - | Turn device screen off (keep mirroring)| `Ctrl`+`o` | - | Expand notification panel | `Ctrl`+`n` | - | Collapse notification panel | `Ctrl`+`Shift`+`n` | - | Copy device clipboard to computer | `Ctrl`+`c` | - | Paste computer clipboard to device | `Ctrl`+`v` | - | Copy computer clipboard to device | `Ctrl`+`Shift`+`v` | - | Enable/disable FPS counter (on stdout) | `Ctrl`+`i` | + | Action | Shortcut | Shortcut (macOS) + | -------------------------------------- |:----------------------------- |:----------------------------- + | Switch fullscreen mode | `Ctrl`+`f` | `Cmd`+`f` + | 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` + | 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 | `Ctrl`+`Shift`+`v` | `Cmd`+`Shift`+`v` + | Enable/disable FPS counter (on stdout) | `Ctrl`+`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/src/input_manager.c b/app/src/input_manager.c index 37e41ca9..5258beda 100644 --- a/app/src/input_manager.c +++ b/app/src/input_manager.c @@ -242,16 +242,27 @@ input_manager_process_key(struct input_manager *input_manager, 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 shortcut involves Alt or Meta, and they should not be forwarded - // to the device + // no shortcuts involve Alt, and it must not be forwarded to the device return; } struct controller *controller = input_manager->controller; // capture all Ctrl events - if (ctrl | meta) { + if (ctrl || cmd) { SDL_Keycode keycode = event->keysym.sym; bool down = event->type == SDL_KEYDOWN; int action = down ? ACTION_DOWN : ACTION_UP; @@ -259,63 +270,59 @@ input_manager_process_key(struct input_manager *input_manager, 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) { action_home(controller, action); } return; case SDLK_b: // fall-through case SDLK_BACKSPACE: - if (control && ctrl && !meta && !shift && !repeat) { + if (control && cmd && !shift && !repeat) { action_back(controller, action); } return; case SDLK_s: - if (control && ctrl && !meta && !shift && !repeat) { + if (control && cmd && !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) { action_menu(controller, action); } return; case SDLK_p: - if (control && ctrl && !meta && !shift && !repeat) { + if (control && cmd && !shift && !repeat) { action_power(controller, action); } return; case SDLK_o: - if (control && ctrl && !shift && !meta && down) { + if (control && cmd && !shift && down) { set_screen_power_mode(controller, SCREEN_POWER_MODE_OFF); } return; case SDLK_DOWN: -#ifdef __APPLE__ - if (control && !ctrl && meta && !shift) { -#else - if (control && ctrl && !meta && !shift) { -#endif + if (control && cmd && !shift) { // forward repeated events action_volume_down(controller, action); } return; case SDLK_UP: -#ifdef __APPLE__ - if (control && !ctrl && meta && !shift) { -#else - if (control && ctrl && !meta && !shift) { -#endif + if (control && cmd && !shift) { // forward repeated events action_volume_up(controller, action); } return; case SDLK_c: - if (control && ctrl && !meta && !shift && !repeat && down) { + if (control && cmd && !shift && !repeat && down) { request_device_clipboard(controller); } return; case SDLK_v: - if (control && ctrl && !meta && !repeat && down) { + if (control && cmd && !repeat && down) { if (shift) { // store the text in the device clipboard set_device_clipboard(controller); @@ -326,29 +333,29 @@ input_manager_process_key(struct input_manager *input_manager, } return; case SDLK_f: - if (ctrl && !meta && !shift && !repeat && down) { + if (!shift && cmd && !repeat && down) { screen_switch_fullscreen(input_manager->screen); } return; case SDLK_x: - if (ctrl && !meta && !shift && !repeat && down) { + if (!shift && cmd && !repeat && down) { screen_resize_to_fit(input_manager->screen); } return; case SDLK_g: - if (ctrl && !meta && !shift && !repeat && down) { + if (!shift && cmd && !repeat && down) { screen_resize_to_pixel_perfect(input_manager->screen); } return; case SDLK_i: - if (ctrl && !meta && !shift && !repeat && down) { + if (!shift && cmd && !repeat && down) { struct fps_counter *fps_counter = input_manager->video_buffer->fps_counter; switch_fps_counter_state(fps_counter); } return; case SDLK_n: - if (control && ctrl && !meta && !repeat && down) { + if (control && cmd && !repeat && down) { if (shift) { collapse_notification_panel(controller); } else { diff --git a/app/src/main.c b/app/src/main.c index 53dd04c0..dfeca7cb 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -35,6 +35,11 @@ struct args { }; static void 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" @@ -115,13 +120,13 @@ static void usage(const char *arg0) { "\n" "Shortcuts:\n" "\n" - " Ctrl+f\n" + " " CTRL_OR_CMD "+f\n" " switch fullscreen mode\n" "\n" - " Ctrl+g\n" + " " CTRL_OR_CMD "+g\n" " resize window to 1:1 (pixel-perfect)\n" "\n" - " Ctrl+x\n" + " " CTRL_OR_CMD "+x\n" " Double-click on black borders\n" " resize window to remove black borders\n" "\n" @@ -129,48 +134,48 @@ static void usage(const char *arg0) { " Middle-click\n" " click on HOME\n" "\n" - " Ctrl+b\n" - " Ctrl+Backspace\n" + " " CTRL_OR_CMD "+b\n" + " " CTRL_OR_CMD "+Backspace\n" " Right-click (when screen is on)\n" " click on BACK\n" "\n" - " Ctrl+s\n" + " " CTRL_OR_CMD "+s\n" " click on APP_SWITCH\n" "\n" " Ctrl+m\n" " click on MENU\n" "\n" - " Ctrl+Up\n" + " " CTRL_OR_CMD "+Up\n" " click on VOLUME_UP\n" "\n" - " Ctrl+Down\n" + " " CTRL_OR_CMD "+Down\n" " click on VOLUME_DOWN\n" "\n" - " Ctrl+p\n" + " " CTRL_OR_CMD "+p\n" " click on POWER (turn screen on/off)\n" "\n" " Right-click (when screen is off)\n" " power on\n" "\n" - " Ctrl+o\n" + " " CTRL_OR_CMD "+o\n" " turn device screen off (keep mirroring)\n" "\n" - " Ctrl+n\n" + " " CTRL_OR_CMD "+n\n" " expand notification panel\n" "\n" - " Ctrl+Shift+n\n" + " " CTRL_OR_CMD "+Shift+n\n" " collapse notification panel\n" "\n" - " Ctrl+c\n" + " " CTRL_OR_CMD "+c\n" " copy device clipboard to computer\n" "\n" - " Ctrl+v\n" + " " CTRL_OR_CMD "+v\n" " paste computer clipboard to device\n" "\n" - " Ctrl+Shift+v\n" + " " CTRL_OR_CMD "+Shift+v\n" " copy computer clipboard to device\n" "\n" - " Ctrl+i\n" + " " CTRL_OR_CMD "+i\n" " enable/disable FPS counter (print frames/second in logs)\n" "\n" " Drag & drop APK file\n"