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: Peter Maydell
Subject: Re: [Qemu-devel] [PATCH] ui/cocoa.m: prevent stuck key situation
Date: Wed, 23 Sep 2015 11:04:15 -0700

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.

> 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?


>
>
>
>  // 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.


> +
> +    /* 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);
        }
    }

thanks
-- PMM



reply via email to

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