qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] ui/cocoa.m: prevent stuck key situation


From: Programmingkid
Subject: Re: [Qemu-devel] [PATCH] ui/cocoa.m: prevent stuck key situation
Date: Wed, 23 Sep 2015 17:44:57 -0400

On Sep 23, 2015, at 2:04 PM, Peter Maydell wrote:

> On 18 September 2015 at 14:46, Programmingkid <address@hidden> wrote:
>> When the user puts QEMU in the background while holding down a key, QEMU
>> will
>> not receive the keyup event when the user lets go of the key. When the user
>> goes
>> back to QEMU, QEMU will think the key is still down causing stuck key
>> symptoms.
>> This patch fixes this problem by releasing all keys when QEMU goes into the
>> background.
> 
> Looks like maybe you're not wrapping lines early enough in your
> commit messages, resulting in this ugly effect when they're
> quoted. It's best to not have lines longer than 75 chars or so.

Sorry, will make the lines shorter in the future.

> 
>> Signed-off-by: John Arbuckle <address@hidden>
>> 
>> ---
>> ui/cocoa.m |   17 ++++++++++++++++-
>> 1 files changed, 16 insertions(+), 1 deletions(-)
>> 
>> diff --git a/ui/cocoa.m b/ui/cocoa.m
>> index 334e6f6..d07b22d 100644
>> --- a/ui/cocoa.m
>> +++ b/ui/cocoa.m
>> @@ -69,6 +69,7 @@ char **gArgv;
>> bool stretch_video;
>> NSTextField *pauseLabel;
>> NSArray * supportedImageFileTypes;
>> +int modifiers_state[256];
> 
> Rather than making this global, could we have the applicationWillResignActive
> method call a new raiseAllKeys method on the NSView?

We could do that, but isn't this more of an app controller function?

>> 
>> 
>> 
>> // keymap conversion
>> int keymap[] =
>> @@ -274,7 +275,6 @@ static void handleAnyDeviceErrors(Error * err)
>>     NSWindow *fullScreenWindow;
>>     float cx,cy,cw,ch,cdx,cdy;
>>     CGDataProviderRef dataProviderRef;
>> -    int modifiers_state[256];
>>     BOOL isMouseGrabbed;
>>     BOOL isFullscreen;
>>     BOOL isAbsoluteEnabled;
>> @@ -933,6 +933,21 @@ QemuCocoaView *cocoaView;
>>     return YES;
>> }
>> 
>> 
>> 
>> +/* Called when QEMU goes into the background */
>> +- (void) applicationWillResignActive: (NSNotification *)aNotification
>> +{
>> +    COCOA_DEBUG("QemuCocoaAppController: applicationWillResignActive\n");
>> +    int keycode, index;
>> +    const int max_index = 126; /* This is the size of the keymap array */
> 
> Hardcoding array sizes is never a good idea. We have an ARRAY_SIZE
> macro which automatically gets it right.

Didn't know about this macro. Will use it in the next patch.

> 
> 
>> +
>> +    /* Release all the keys to prevent a stuck key situation */
>> +    for(index = 0; index <= max_index; index++) {
>> +        keycode = keymap[index];
>> +        modifiers_state[keycode] = 0;
>> +        qemu_input_event_send_key_number(dcl->con, keycode, false);
>> +    }
> 
> This will send key-up events even for keys which are already up.
> Instead you can just send events for only the keys which are down
> (and avoid the lookup in keymap[] too):
> 
> 
>    for (i = 0; i < ARRAY_SIZE(modifiers_state); i++) {
>        if (modifiers_state[i])) {
>            modifiers_state[i] = 0;
>            qemu_input_event_send_key_number(dcl->con, i, false);
>        }
>    }

Sounds good. Will use it.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]