From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48963) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZeuEc-0000SB-GC for qemu-devel@nongnu.org; Wed, 23 Sep 2015 20:18:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZeuEZ-0003xf-Bh for qemu-devel@nongnu.org; Wed, 23 Sep 2015 20:18:02 -0400 Received: from mail-qg0-x235.google.com ([2607:f8b0:400d:c04::235]:34734) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZeuEZ-0003xT-7q for qemu-devel@nongnu.org; Wed, 23 Sep 2015 20:17:59 -0400 Received: by qgez77 with SMTP id z77so33214612qge.1 for ; Wed, 23 Sep 2015 17:17:58 -0700 (PDT) From: Programmingkid Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Date: Wed, 23 Sep 2015 20:17:55 -0400 Message-Id: Mime-Version: 1.0 (Apple Message framework v1084) Subject: [Qemu-devel] [PATCH v2] ui/cocoa.m: prevent stuck key situation List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Maydell , qemu-devel qemu-devel 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 down keys when QEMU goes into the background. Signed-off-by: John Arbuckle --- Removed the modifiers_state global variable. Added a raiseAllKeys method. ui/cocoa.m | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+), 0 deletions(-) diff --git a/ui/cocoa.m b/ui/cocoa.m index 334e6f6..4d15553 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -304,6 +304,7 @@ static void handleAnyDeviceErrors(Error * err) - (float) cdx; - (float) cdy; - (QEMUScreen) gscreen; +- (void) raiseAllKeys; @end QemuCocoaView *cocoaView; @@ -798,6 +799,23 @@ QemuCocoaView *cocoaView; - (float) cdx {return cdx;} - (float) cdy {return cdy;} - (QEMUScreen) gscreen {return screen;} + +/* + * Makes the target think all down keys are being released. + * This prevents a stuck key problem. + */ +- (void) raiseAllKeys +{ + int index; + const int max_index = 220; /* This is the highest value key */ + + for (index = 0; index <= max_index; index++) { + if (modifiers_state[index]) { + modifiers_state[index] = 0; + qemu_input_event_send_key_number(dcl->con, index, false); + } + } +} @end @@ -933,6 +951,14 @@ QemuCocoaView *cocoaView; return YES; } +/* Called when QEMU goes into the background */ +- (void) applicationWillResignActive: (NSNotification *)aNotification +{ + COCOA_DEBUG("QemuCocoaAppController: applicationWillResignActive\n"); + + [cocoaView raiseAllKeys]; +} + - (void)startEmulationWithArgc:(int)argc argv:(char**)argv { COCOA_DEBUG("QemuCocoaAppController: startEmulationWithArgc\n"); -- 1.7.5.4