qemu-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]