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