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 <programmingk...@gmail.com> > Signed-off-by: Peter Maydell <peter.mayd...@linaro.org> > --- > 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.