[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] ui/cocoa.m: prevent stuck command key when goin
From: |
Programmingkid |
Subject: |
Re: [Qemu-devel] [PATCH] ui/cocoa.m: prevent stuck command key when going into full screen mode |
Date: |
Sun, 1 Jul 2018 18:08:13 -0400 |
On Jul 1, 2018, at 3:30 PM, Peter Maydell wrote:
> On 19 June 2018 at 02:58, John Arbuckle <address@hidden> 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 <address@hidden>
>> ---
>> 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.