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. 

Signed-off-by: John Arbuckle <programmingk...@gmail.com>

---
 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];
 
 // 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 */
+
+    /* 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);
+    }
+}
+
 - (void)startEmulationWithArgc:(int)argc argv:(char**)argv
 {
     COCOA_DEBUG("QemuCocoaAppController: startEmulationWithArgc\n");
-- 
1.7.5.4

Reply via email to