[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] ui/cocoa: Pass command key through to guest whe
From: |
Programmingkid |
Subject: |
Re: [Qemu-devel] [PATCH] ui/cocoa: Pass command key through to guest when VM has mousegrab |
Date: |
Tue, 10 Dec 2013 08:51:11 -0500 |
On Dec 8, 2013, at 12:30 PM, Peter Maydell wrote:
> The guest might want to be able to use the command key for its won
> purposes (as command if it is MacOS X, or for the Windows key if
> it is a PC guest, for instance). In line with other UI frontends,
> pass it through if the guest has mousegrab, and only use it for
> host UI menu accelerators if not grabbed.
>
> Thanks to John Arbuckle for reporting this problem, helping
> us work through what the best solution would be and providing
> a patch which was the initial inspiration for this one.
>
> Reported-by: John Arbuckle <address@hidden>
> Signed-off-by: Peter Maydell <address@hidden>
> ---
> John -- my apologies for having let this issue (and your patch
> http://patchwork.ozlabs.org/patch/267627/ ) lie around
> unaddressed/unreviewed for such a long time. I finally got
> some time to look at the problem, and I think this patch should
> fix the problem of Mac guests not getting the command key
> (and also of Windows guests not getting Windows keys, since
> they're the same scancode).
>
> Tested with an x86/Linux guest and "showkeys" to confirm that
> when mousegrab is enabled the command keys are passed through.
>
> ui/cocoa.m | 25 ++++++++++++++++++-------
> 1 file changed, 18 insertions(+), 7 deletions(-)
>
> diff --git a/ui/cocoa.m b/ui/cocoa.m
> index be49179..d38cf22 100644
> --- a/ui/cocoa.m
> +++ b/ui/cocoa.m
> @@ -129,8 +129,8 @@ int keymap[] =
> 14, // 51 0x33 0x0e BKSP QZ_BACKSPACE
> 0, // 52 0x34 Undefined
> 1, // 53 0x35 0x01 ESC QZ_ESCAPE
> - 0, // 54 0x36 QZ_RMETA
> - 0, // 55 0x37 QZ_LMETA
> + 220, // 54 0x36 0xdc E0,5C R GUI QZ_RMETA
> + 219, // 55 0x37 0xdb E0,5B L GUI QZ_LMETA
> 42, // 56 0x38 0x2a L SHFT QZ_LSHIFT
> 58, // 57 0x39 0x3a CAPS QZ_CAPSLOCK
> 56, // 58 0x3A 0x38 L ALT QZ_LALT
> @@ -206,8 +206,6 @@ int keymap[] =
>
> /* Aditional 104 Key XP-Keyboard Scancodes from
> http://www.computer-engineering.org/ps2keyboard/scancodes1.html */
> /*
> - 219 // 0xdb e0,5b L GUI
> - 220 // 0xdc e0,5c R GUI
> 221 // 0xdd e0,5d APPS
> // E0,2A,E0,37 PRNT SCRN
> // E1,1D,45,E1,9D,C5 PAUSE
> @@ -494,6 +492,12 @@ QemuCocoaView *cocoaView;
> switch ([event type]) {
> case NSFlagsChanged:
> keycode = cocoa_keycode_to_qemu([event keyCode]);
> +
> + if ((keycode == 219 || keycode == 220) && !isMouseGrabed) {
> + /* Don't pass command key changes to guest unless mouse is
> grabbed */
> + keycode = 0;
> + }
> +
> if (keycode) {
> if (keycode == 58 || keycode == 69) { // emulate caps lock
> and num lock keydown and keyup
> kbd_put_keycode(keycode);
> @@ -517,15 +521,15 @@ QemuCocoaView *cocoaView;
> }
> break;
> case NSKeyDown:
> + keycode = cocoa_keycode_to_qemu([event keyCode]);
>
> - // forward command Key Combos
> - if ([event modifierFlags] & NSCommandKeyMask) {
> + // forward command key combos to the host UI unless the mouse is
> grabbed
> + if (!isMouseGrabed && ([event modifierFlags] &
> NSCommandKeyMask)) {
> [NSApp sendEvent:event];
> return;
> }
>
> // default
> - keycode = cocoa_keycode_to_qemu([event keyCode]);
>
> // handle control + alt Key Combos (ctrl+alt is reserved for QEMU)
> if (([event modifierFlags] & NSControlKeyMask) && ([event
> modifierFlags] & NSAlternateKeyMask)) {
> @@ -581,6 +585,13 @@ QemuCocoaView *cocoaView;
> break;
> case NSKeyUp:
> keycode = cocoa_keycode_to_qemu([event keyCode]);
> +
> + // don't pass the guest a spurious key-up if we treated this
> + // command-key combo as a host UI action
> + if (!isMouseGrabed && ([event modifierFlags] &
> NSCommandKeyMask)) {
> + return;
> + }
> +
> if (qemu_console_is_graphic(NULL)) {
> if (keycode & 0x80)
> kbd_put_keycode(0xe0);
> --
> 1.7.11.4
>
Sorry, but the person who is in charge of the cocoa.m file doesn't care about
advancing it. He has other priorities. I've tried and given up on him.