[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2] ui/cocoa.m: verify with user before quitting
From: |
Peter Maydell |
Subject: |
Re: [Qemu-devel] [PATCH v2] ui/cocoa.m: verify with user before quitting QEMU |
Date: |
Wed, 23 Sep 2015 10:55:46 -0700 |
On 20 September 2015 at 12:20, Programmingkid <address@hidden> wrote:
> This patch prevents the user from accidentally quitting QEMU by pushing
> Command-Q or by pushing the close button on the main window. When the user
> does
> one of these two things, a dialog box appears verifying with the user if he or
> she wants to quit QEMU.
>
> Signed-off-by: John Arbuckle <address@hidden>
Thanks for the respin. I generally like this patch; I have a few minor
tweaks to suggest below, and there are a couple of deprecation
warnings if you build on OSX 10.10, but otherwise it looks good.
>
> ---
> ui/cocoa.m | 35 +++++++++++++++++++++++++++++++++--
> 1 files changed, 33 insertions(+), 2 deletions(-)
>
> diff --git a/ui/cocoa.m b/ui/cocoa.m
> index 334e6f6..3c5172c 100644
> --- a/ui/cocoa.m
> +++ b/ui/cocoa.m
> @@ -807,10 +807,11 @@ QemuCocoaView *cocoaView;
> QemuCocoaAppController
> ------------------------------------------------------
> */
> address@hidden QemuCocoaAppController : NSObject
> address@hidden QemuCocoaAppController : NSObject <NSWindowDelegate
> #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
> - <NSApplicationDelegate>
> + , NSApplicationDelegate
> #endif
> +>
The docs say that NSWindowDelegate is 10.6 and later, so
I think you need the whole <NSWindowDelegate, NSApplicationDelegate>
inside the #if.
(10.6 is when the formal protocol interface stuff came in;
prior to that the delegation stuff was what the docs call an
"informal protocol", with no type checking. So I think the
actual implementation of the NSWindowDelegate functions in
the class will work ok on 10.5.)
> {
> }
> - (void)startEmulationWithArgc:(int)argc argv:(char**)argv;
> @@ -829,6 +830,7 @@ QemuCocoaView *cocoaView;
> - (void)powerDownQEMU:(id)sender;
> - (void)ejectDeviceMedia:(id)sender;
> - (void)changeDeviceMedia:(id)sender;
> +- (BOOL)verifyQuit;
> @end
>
> @implementation QemuCocoaAppController
> @@ -862,6 +864,7 @@ QemuCocoaView *cocoaView;
> #endif
> [normalWindow makeKeyAndOrderFront:self];
> [normalWindow center];
> + [normalWindow setDelegate: self];
> stretch_video = false;
>
> /* Used for displaying pause on the screen */
> @@ -933,6 +936,21 @@ 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];
I think it would be more informative here to say:
/* 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; /* The main window should always be available */
> +}
> +
> - (void)startEmulationWithArgc:(int)argc argv:(char**)argv
> {
> COCOA_DEBUG("QemuCocoaAppController: startEmulationWithArgc\n");
> @@ -1125,6 +1143,19 @@ QemuCocoaView *cocoaView;
> }
> }
>
> +/* Verifies if the user really wants to quit */
> +- (BOOL)verifyQuit
> +{
> + NSInteger response;
> + response = NSRunAlertPanel(@"Quit?", @"Are you sure you want to quit?",
> + @"Cancel", @"Quit",
> nil);
> + if(response == NSAlertAlternateReturn) {
> + return YES; /* Yes, I want to quit */
> + } else {
> + return NO; /* No, I don't want to quit */
Not sure the comments here really add much information.
> + }
> +}
There are some OSX 10.10 deprecation warnings from this code:
OBJC ui/cocoa.o
/Users/pm215/src/qemu/ui/cocoa.m:1150:16: warning: 'NSRunAlertPanel'
is deprecated: first deprecated in OS X 10.10 - Use NSAlert instead
[-Wdeprecated-declarations]
response = NSRunAlertPanel(@"Quit?", @"Are you sure you want to quit?",
^
/System/Library/Frameworks/AppKit.framework/Headers/NSPanel.h:48:25:
note: 'NSRunAlertPanel' has been explicitly marked deprecated here
APPKIT_EXTERN NSInteger NSRunAlertPanel(NSString *title, NSString
*msgFormat, NSString *defaultButton, NSString *alternateButton,
NSString *otherButton, ...) NS_FORMAT_FUNCTION(2,6) ...
^
/Users/pm215/src/qemu/ui/cocoa.m:1152:20: warning:
'NSAlertAlternateReturn' is deprecated: first deprecated in OS X 10.10
- Use NSAlertFirstButtonReturn, etc instead
[-Wdeprecated-declarations]
if(response == NSAlertAlternateReturn) {
^
/System/Library/Frameworks/AppKit.framework/Headers/NSPanel.h:80:5:
note: 'NSAlertAlternateReturn' has been explicitly marked deprecated
here
NSAlertAlternateReturn NS_ENUM_DEPRECATED_MAC(10_0, 10_10, "Use
NSAlertFirstButtonReturn, etc instead") = 0,
^
thanks
-- PMM