cocoa queue:
* fix stuck-key bug if keys were down when QEMU lost focus * prompt the user whether they really meant to quit * remove the 'open image file' dialog box we used to display if the user started QEMU without arguments -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCAAGBQJWBcfvAAoJEDwlJe0UNgzeU0MP/0gOy+egfcy39VGRRglEeZ+o 0Xh22O+bN0rKUiYkT+liRBTDrvr4c0HiUZsnojpVG6NgWaNfeBbcSuWH6BZ0XQkZ yUD3F6oRMkR8Kckj9g0Jh4fezsI4YkZcBF2kBj+lkFdNqqDX40AFiffheiFVqVRf E+NHoNULovD8+vzTZoCUYXzg/6rIF1ZMMT4PyuYFDvb8l1FuF7hTBt9B6mvChVAm GI17k6i3aE1gaH/jJDFbO4OdXbHuaiHq1KQK+ifg+jUWd3zJFQ/Fq8fiJ+BD84l8 /zjnW7vmOEO/cuV4wAIf8hELoMG6i61H4Rsakofz2qUqJ52g3ii5azPMnJmoRI/O GOMkJQ9ZaeBR/uMtwX2UP3o2SCZV/1IUFCAK6T1Wq93zb1bVIV9BtjsJr/+HPS47 AzLhx1QKw4aBynITld+515mXUcUbYLC4xUzlovuEZEgISrmBImGobElPQWCg0j+9 68xFmYo1j8pHTy17hCMSrVbiTQ0qLN+8vrxloFObj4Mk0rxf6ZDq6yzqbXDN7GqP tmOkiESSXctMoXNyT+TWNqytVwjNYVeCtQJ1tn3rZS22JXqyuYcw0OxaUX+zPts5 xW0pPYCNiASnsfd2cvERBMwbcvkpnpvYFtPHujUzlOQufxl3hyPjRd7OSbVJyPmM M26Rx3lKksnkxIOVhuow =jTmI -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/pmaydell/tags/pull-cocoa-20150925-1' into staging cocoa queue: * fix stuck-key bug if keys were down when QEMU lost focus * prompt the user whether they really meant to quit * remove the 'open image file' dialog box we used to display if the user started QEMU without arguments # gpg: Signature made Fri 25 Sep 2015 23:17:19 BST using RSA key ID 14360CDE # gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" # gpg: aka "Peter Maydell <pmaydell@gmail.com>" # gpg: aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" * remotes/pmaydell/tags/pull-cocoa-20150925-1: ui/cocoa.m: remove open dialog code ui/cocoa.m: prevent stuck key situation ui/cocoa.m: verify with user before quitting QEMU Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
6996a002d8
121
ui/cocoa.m
121
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,24 @@ 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, since we will not see
|
||||
* key up events for those keys after we have lost focus.
|
||||
*/
|
||||
- (void) raiseAllKeys
|
||||
{
|
||||
int index;
|
||||
const int max_index = ARRAY_SIZE(modifiers_state);
|
||||
|
||||
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
|
||||
|
||||
|
||||
@ -809,12 +828,11 @@ QemuCocoaView *cocoaView;
|
||||
*/
|
||||
@interface QemuCocoaAppController : NSObject
|
||||
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
|
||||
<NSApplicationDelegate>
|
||||
<NSWindowDelegate, NSApplicationDelegate>
|
||||
#endif
|
||||
{
|
||||
}
|
||||
- (void)startEmulationWithArgc:(int)argc argv:(char**)argv;
|
||||
- (void)openPanelDidEnd:(NSOpenPanel *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
|
||||
- (void)doToggleFullScreen:(id)sender;
|
||||
- (void)toggleFullScreen:(id)sender;
|
||||
- (void)showQEMUDoc:(id)sender;
|
||||
@ -829,6 +847,7 @@ QemuCocoaView *cocoaView;
|
||||
- (void)powerDownQEMU:(id)sender;
|
||||
- (void)ejectDeviceMedia:(id)sender;
|
||||
- (void)changeDeviceMedia:(id)sender;
|
||||
- (BOOL)verifyQuit;
|
||||
@end
|
||||
|
||||
@implementation QemuCocoaAppController
|
||||
@ -862,6 +881,7 @@ QemuCocoaView *cocoaView;
|
||||
#endif
|
||||
[normalWindow makeKeyAndOrderFront:self];
|
||||
[normalWindow center];
|
||||
[normalWindow setDelegate: self];
|
||||
stretch_video = false;
|
||||
|
||||
/* Used for displaying pause on the screen */
|
||||
@ -895,29 +915,8 @@ QemuCocoaView *cocoaView;
|
||||
- (void)applicationDidFinishLaunching: (NSNotification *) note
|
||||
{
|
||||
COCOA_DEBUG("QemuCocoaAppController: applicationDidFinishLaunching\n");
|
||||
|
||||
// Display an open dialog box if no arguments were passed or
|
||||
// if qemu was launched from the finder ( the Finder passes "-psn" )
|
||||
if( gArgc <= 1 || strncmp ((char *)gArgv[1], "-psn", 4) == 0) {
|
||||
NSOpenPanel *op = [[NSOpenPanel alloc] init];
|
||||
[op setPrompt:@"Boot image"];
|
||||
[op setMessage:@"Select the disk image you want to boot.\n\nHit the \"Cancel\" button to quit"];
|
||||
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
|
||||
[op setAllowedFileTypes:supportedImageFileTypes];
|
||||
[op beginSheetModalForWindow:normalWindow
|
||||
completionHandler:^(NSInteger returnCode)
|
||||
{ [self openPanelDidEnd:op
|
||||
returnCode:returnCode contextInfo:NULL ]; } ];
|
||||
#else
|
||||
// Compatibility code for pre-10.6, using deprecated method
|
||||
[op beginSheetForDirectory:nil file:nil types:filetypes
|
||||
modalForWindow:normalWindow modalDelegate:self
|
||||
didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo:NULL];
|
||||
#endif
|
||||
} else {
|
||||
// or launch QEMU, with the global args
|
||||
[self startEmulationWithArgc:gArgc argv:(char **)gArgv];
|
||||
}
|
||||
// launch QEMU, with the global args
|
||||
[self startEmulationWithArgc:gArgc argv:(char **)gArgv];
|
||||
}
|
||||
|
||||
- (void)applicationWillTerminate:(NSNotification *)aNotification
|
||||
@ -933,6 +932,33 @@ QemuCocoaView *cocoaView;
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (NSApplicationTerminateReply)applicationShouldTerminate:
|
||||
(NSApplication *)sender
|
||||
{
|
||||
COCOA_DEBUG("QemuCocoaAppController: applicationShouldTerminate\n");
|
||||
return [self verifyQuit];
|
||||
}
|
||||
|
||||
/* Called when the user clicks on a window's close button */
|
||||
- (BOOL)windowShouldClose:(id)sender
|
||||
{
|
||||
COCOA_DEBUG("QemuCocoaAppController: windowShouldClose\n");
|
||||
[NSApp terminate: sender];
|
||||
/* If the user allows the application to quit then the call to
|
||||
* NSApp terminate will never return. If we get here then the user
|
||||
* cancelled the quit, so we should return NO to not permit the
|
||||
* closing of this window.
|
||||
*/
|
||||
return NO;
|
||||
}
|
||||
|
||||
/* 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");
|
||||
@ -942,36 +968,6 @@ QemuCocoaView *cocoaView;
|
||||
exit(status);
|
||||
}
|
||||
|
||||
- (void)openPanelDidEnd:(NSOpenPanel *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
|
||||
{
|
||||
COCOA_DEBUG("QemuCocoaAppController: openPanelDidEnd\n");
|
||||
|
||||
/* The NSFileHandlingPanelOKButton/NSFileHandlingPanelCancelButton values for
|
||||
* returnCode strictly only apply for the 10.6-and-up beginSheetModalForWindow
|
||||
* API. For the legacy pre-10.6 beginSheetForDirectory API they are NSOKButton
|
||||
* and NSCancelButton. However conveniently the values are the same.
|
||||
* We use the non-legacy names because the others are deprecated in OSX 10.10.
|
||||
*/
|
||||
if (returnCode == NSFileHandlingPanelCancelButton) {
|
||||
exit(0);
|
||||
} else if (returnCode == NSFileHandlingPanelOKButton) {
|
||||
char *img = (char*)[ [ [ sheet URL ] path ] cStringUsingEncoding:NSASCIIStringEncoding];
|
||||
|
||||
char **argv = g_new(char *, 4);
|
||||
|
||||
[sheet close];
|
||||
|
||||
argv[0] = g_strdup(gArgv[0]);
|
||||
argv[1] = g_strdup("-hda");
|
||||
argv[2] = g_strdup(img);
|
||||
argv[3] = NULL;
|
||||
|
||||
// printf("Using argc %d argv %s -hda %s\n", 3, gArgv[0], img);
|
||||
|
||||
[self startEmulationWithArgc:3 argv:(char**)argv];
|
||||
}
|
||||
}
|
||||
|
||||
/* We abstract the method called by the Enter Fullscreen menu item
|
||||
* because Mac OS 10.7 and higher disables it. This is because of the
|
||||
* menu item's old selector's name toggleFullScreen:
|
||||
@ -1125,6 +1121,21 @@ QemuCocoaView *cocoaView;
|
||||
}
|
||||
}
|
||||
|
||||
/* Verifies if the user really wants to quit */
|
||||
- (BOOL)verifyQuit
|
||||
{
|
||||
NSAlert *alert = [NSAlert new];
|
||||
[alert autorelease];
|
||||
[alert setMessageText: @"Are you sure you want to quit QEMU?"];
|
||||
[alert addButtonWithTitle: @"Cancel"];
|
||||
[alert addButtonWithTitle: @"Quit"];
|
||||
if([alert runModal] == NSAlertSecondButtonReturn) {
|
||||
return YES;
|
||||
} else {
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user