[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 20/21] ui/cocoa: add option to swap Option and Command
From: |
Philippe Mathieu-Daudé |
Subject: |
[PULL 20/21] ui/cocoa: add option to swap Option and Command |
Date: |
Tue, 15 Mar 2022 13:53:49 +0100 |
From: Gustavo Noronha Silva <gustavo@noronha.dev.br>
On Mac OS X the Option key maps to Alt and Command to Super/Meta. This change
swaps them around so that Alt is the key closer to the space bar and Meta/Super
is between Control and Alt, like on non-Mac keyboards.
It is a cocoa display option, disabled by default.
Acked-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Gustavo Noronha Silva <gustavo@noronha.dev.br>
Message-Id: <20210713213200.2547-3-gustavo@noronha.dev.br>
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
Message-Id: <20220306121119.45631-3-akihiko.odaki@gmail.com>
Reviewed-by: Will Cohen <wwcohen@gmail.com>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
qapi/ui.json | 7 ++++++-
qemu-options.hx | 2 +-
ui/cocoa.m | 49 +++++++++++++++++++++++++++++++++++++++----------
3 files changed, 46 insertions(+), 12 deletions(-)
diff --git a/qapi/ui.json b/qapi/ui.json
index 1d60d5fc78..664da9e462 100644
--- a/qapi/ui.json
+++ b/qapi/ui.json
@@ -1275,12 +1275,17 @@
# a global grab on key events. (default: off)
# See https://support.apple.com/en-in/guide/mac-help/mh32356/mac
#
+# @swap-opt-cmd: Swap the Option and Command keys so that their key codes match
+# their position on non-Mac keyboards and you can use Meta/Super
+# and Alt where you expect them. (default: off)
+#
# Since: 7.0
##
{ 'struct': 'DisplayCocoa',
'data': {
'*left-command-key': 'bool',
- '*full-grab': 'bool'
+ '*full-grab': 'bool',
+ '*swap-opt-cmd': 'bool'
} }
##
diff --git a/qemu-options.hx b/qemu-options.hx
index 4395378bb8..58f2f76775 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1917,7 +1917,7 @@ DEF("display", HAS_ARG, QEMU_OPTION_display,
"-display curses[,charset=<encoding>]\n"
#endif
#if defined(CONFIG_COCOA)
- "-display cocoa[,full_grab=on|off]\n"
+ "-display cocoa[,full-grab=on|off][,swap-opt-cmd=on|off]\n"
#endif
#if defined(CONFIG_OPENGL)
"-display egl-headless[,rendernode=<file>]\n"
diff --git a/ui/cocoa.m b/ui/cocoa.m
index b1250b7408..cb6e7c41dc 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -96,6 +96,7 @@ static DisplayChangeListener dcl = {
static int last_buttons;
static int cursor_hide = 1;
static int left_command_key_enabled = 1;
+static bool swap_opt_cmd;
static int gArgc;
static char **gArgv;
@@ -854,12 +855,22 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy,
CGEventType type, CGEven
qkbd_state_key_event(kbd, Q_KEY_CODE_CTRL_R, false);
}
if (!(modifiers & NSEventModifierFlagOption)) {
- qkbd_state_key_event(kbd, Q_KEY_CODE_ALT, false);
- qkbd_state_key_event(kbd, Q_KEY_CODE_ALT_R, false);
+ if (swap_opt_cmd) {
+ qkbd_state_key_event(kbd, Q_KEY_CODE_META_L, false);
+ qkbd_state_key_event(kbd, Q_KEY_CODE_META_R, false);
+ } else {
+ qkbd_state_key_event(kbd, Q_KEY_CODE_ALT, false);
+ qkbd_state_key_event(kbd, Q_KEY_CODE_ALT_R, false);
+ }
}
if (!(modifiers & NSEventModifierFlagCommand)) {
- qkbd_state_key_event(kbd, Q_KEY_CODE_META_L, false);
- qkbd_state_key_event(kbd, Q_KEY_CODE_META_R, false);
+ if (swap_opt_cmd) {
+ qkbd_state_key_event(kbd, Q_KEY_CODE_ALT, false);
+ qkbd_state_key_event(kbd, Q_KEY_CODE_ALT_R, false);
+ } else {
+ qkbd_state_key_event(kbd, Q_KEY_CODE_META_L, false);
+ qkbd_state_key_event(kbd, Q_KEY_CODE_META_R, false);
+ }
}
switch ([event type]) {
@@ -891,29 +902,44 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy,
CGEventType type, CGEven
case kVK_Option:
if (!!(modifiers & NSEventModifierFlagOption)) {
- [self toggleKey:Q_KEY_CODE_ALT];
+ if (swap_opt_cmd) {
+ [self toggleKey:Q_KEY_CODE_META_L];
+ } else {
+ [self toggleKey:Q_KEY_CODE_ALT];
+ }
}
break;
case kVK_RightOption:
if (!!(modifiers & NSEventModifierFlagOption)) {
- [self toggleKey:Q_KEY_CODE_ALT_R];
+ if (swap_opt_cmd) {
+ [self toggleKey:Q_KEY_CODE_META_R];
+ } else {
+ [self toggleKey:Q_KEY_CODE_ALT_R];
+ }
}
break;
/* Don't pass command key changes to guest unless mouse is
grabbed */
case kVK_Command:
if (isMouseGrabbed &&
- !!(modifiers & NSEventModifierFlagCommand) &&
- left_command_key_enabled) {
- [self toggleKey:Q_KEY_CODE_META_L];
+ !!(modifiers & NSEventModifierFlagCommand)) {
+ if (swap_opt_cmd) {
+ [self toggleKey:Q_KEY_CODE_ALT];
+ } else {
+ [self toggleKey:Q_KEY_CODE_META_L];
+ }
}
break;
case kVK_RightCommand:
if (isMouseGrabbed &&
!!(modifiers & NSEventModifierFlagCommand)) {
- [self toggleKey:Q_KEY_CODE_META_R];
+ if (swap_opt_cmd) {
+ [self toggleKey:Q_KEY_CODE_ALT_R];
+ } else {
+ [self toggleKey:Q_KEY_CODE_META_R];
+ }
}
break;
}
@@ -2068,6 +2094,9 @@ static void cocoa_display_init(DisplayState *ds,
DisplayOptions *opts)
if (opts->has_show_cursor && opts->show_cursor) {
cursor_hide = 0;
}
+ if (opts->u.cocoa.has_swap_opt_cmd) {
+ swap_opt_cmd = opts->u.cocoa.swap_opt_cmd;
+ }
if (opts->u.cocoa.has_left_command_key && !opts->u.cocoa.left_command_key)
{
left_command_key_enabled = 0;
--
2.34.1
- [PULL 10/21] coreaudio: Always return 0 in handle_voice_change, (continued)
- [PULL 10/21] coreaudio: Always return 0 in handle_voice_change, Philippe Mathieu-Daudé, 2022/03/15
- [PULL 11/21] audio: Rename coreaudio extension to use Objective-C compiler, Philippe Mathieu-Daudé, 2022/03/15
- [PULL 12/21] osdep: Avoid using Clang-specific __builtin_available(), Philippe Mathieu-Daudé, 2022/03/15
- [PULL 13/21] meson: Resolve the entitlement.sh script once for good, Philippe Mathieu-Daudé, 2022/03/15
- [PULL 14/21] meson: Log QEMU_CXXFLAGS content in summary, Philippe Mathieu-Daudé, 2022/03/15
- [PULL 15/21] configure: Pass filtered QEMU_OBJCFLAGS to meson, Philippe Mathieu-Daudé, 2022/03/15
- [PULL 16/21] ui/cocoa: Constify qkeycode translation arrays, Philippe Mathieu-Daudé, 2022/03/15
- [PULL 17/21] ui/cocoa: add option to disable left-command forwarding to guest, Philippe Mathieu-Daudé, 2022/03/15
- [PULL 18/21] ui/cocoa: release mouse when user switches away from QEMU window, Philippe Mathieu-Daudé, 2022/03/15
- [PULL 19/21] ui/cocoa: capture all keys and combos when mouse is grabbed, Philippe Mathieu-Daudé, 2022/03/15
- [PULL 20/21] ui/cocoa: add option to swap Option and Command,
Philippe Mathieu-Daudé <=
- [PULL 21/21] MAINTAINERS: Volunteer to maintain Darwin-based hosts support, Philippe Mathieu-Daudé, 2022/03/15
- Re: [PULL 00/21] Darwin patches for 2022-03-15, Peter Maydell, 2022/03/15