On Jul 1, 2018, at 3:30 PM, Peter Maydell wrote:
> On 19 June 2018 at 02:58, John Arbuckle <programmingk...@gmail.com> wrote: >> When the user pushes Command-F in QEMU while the mouse is ungrabbed, QEMU >> goes into full screen mode. When the user finally releases the command key, >> it is sent to the guest as an event. > > What is "it" here? This sentences implies that "it" is the key-release > event for the command key, but the following sentence suggests it's > the key-press event. It is the key release event for the command key. >> The makes the guest operating system >> think the command key is down when it is really up. To prevent this situation >> from happening, we simply drop the first command key event after the user has >> gone into full screen mode using Command-F. >> >> Signed-off-by: John Arbuckle <programmingk...@gmail.com> >> --- >> ui/cocoa.m | 18 +++++++++++++++++- >> 1 file changed, 17 insertions(+), 1 deletion(-) >> >> diff --git a/ui/cocoa.m b/ui/cocoa.m >> index 2991ed4..024aba2 100644 >> --- a/ui/cocoa.m >> +++ b/ui/cocoa.m >> @@ -287,6 +287,7 @@ static void handleAnyDeviceErrors(Error * err) >> BOOL isFullscreen; >> BOOL isAbsoluteEnabled; >> BOOL isMouseDeassociated; >> + BOOL prevent_stuck_command_key; >> } >> - (void) switchSurface:(DisplaySurface *)surface; >> - (void) grabMouse; >> @@ -330,7 +331,7 @@ QemuCocoaView *cocoaView; >> screen.bitsPerPixel = 32; >> screen.width = frameRect.size.width; >> screen.height = frameRect.size.height; >> - >> + prevent_stuck_command_key = NO; >> } >> return self; >> } >> @@ -552,6 +553,14 @@ QemuCocoaView *cocoaView; >> } >> >> - (void) toggleModifier: (int)keycode { >> + >> + /* Prevents the command key from being sent to the guest */ >> + if ((keycode == Q_KEY_CODE_META_L || keycode == Q_KEY_CODE_META_R) && >> + prevent_stuck_command_key == YES) { >> + prevent_stuck_command_key = NO; >> + return; >> + } >> + >> // Toggle the stored state. >> modifiers_state[keycode] = !modifiers_state[keycode]; >> // Send a keyup or keydown depending on the state. >> @@ -691,6 +700,13 @@ QemuCocoaView *cocoaView; >> >> // forward command key combos to the host UI unless the mouse is >> grabbed >> if (!isMouseGrabbed && ([event modifierFlags] & >> NSEventModifierFlagCommand)) { >> + /* >> + * Prevent the command key from being stuck down in the >> guest >> + * when using Command-F for full screen mode >> + */ >> + if (keycode == Q_KEY_CODE_F) { >> + prevent_stuck_command_key = YES; >> + } >> [NSApp sendEvent:event]; >> return; >> } >> -- >> 2.7.2 > > I can sort of see why this might work, but the flow of what's > going wrong isn't clear from your commit message, and the > change looks really inelegant. What would be a more suitable solution to this problem? I realize using a flag to indicate this situation isn't the prettiest, but it does get the job done.