All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3] ui/cocoa.m: Make a better about dialog
@ 2016-07-29 15:16 Programmingkid
  2016-08-15 21:31 ` Peter Maydell
  0 siblings, 1 reply; 2+ messages in thread
From: Programmingkid @ 2016-07-29 15:16 UTC (permalink / raw)
  To: Peter Maydell; +Cc: qemu-devel qemu-devel

The about dialog in QEMU on Mac OS X is very plain and unhelpful. This patch
makes the about dialog look a lot better and have some descriptive information
on what version of QEMU the user is running.

Signed-off-by: John Arbuckle <programmingkidx@gmail.com>
---
version 3 changes:
Removed buffer related code

version 2 changes:
Added QEMU version to the version label

 ui/cocoa.m | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 104 insertions(+), 3 deletions(-)

diff --git a/ui/cocoa.m b/ui/cocoa.m
index 36c6bf0..e17401b 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -34,6 +34,7 @@
 #include "qmp-commands.h"
 #include "sysemu/blockdev.h"
 #include <Carbon/Carbon.h>
+#include "qemu-version.h"
 
 #ifndef MAC_OS_X_VERSION_10_5
 #define MAC_OS_X_VERSION_10_5 1050
@@ -63,7 +64,7 @@ typedef struct {
     int bitsPerPixel;
 } QEMUScreen;
 
-NSWindow *normalWindow;
+NSWindow *normalWindow, *about_window;
 static DisplayChangeListener *dcl;
 static int last_buttons;
 
@@ -670,7 +671,9 @@ QemuCocoaView *cocoaView;
         case NSLeftMouseUp:
             mouse_event = true;
             if (!isMouseGrabbed && [self screenContainsPoint:p]) {
-                [self grabMouse];
+                if([[self window] isKeyWindow]) {
+                    [self grabMouse];
+                }
             }
             break;
         case NSRightMouseUp:
@@ -824,6 +827,8 @@ QemuCocoaView *cocoaView;
 - (void)changeDeviceMedia:(id)sender;
 - (BOOL)verifyQuit;
 - (void)openDocumentation:(NSString *)filename;
+- (IBAction) do_about_menu_item: (id) sender;
+- (void)make_about_window;
 @end
 
 @implementation QemuCocoaAppController
@@ -876,6 +881,7 @@ QemuCocoaView *cocoaView;
         supportedImageFileTypes = [NSArray arrayWithObjects: @"img", @"iso", @"dmg",
                                  @"qcow", @"qcow2", @"cloop", @"vmdk", @"cdr",
                                   nil];
+        [self make_about_window];
     }
     return self;
 }
@@ -1138,6 +1144,101 @@ QemuCocoaView *cocoaView;
     }
 }
 
+/* The action method for the About menu item */
+- (IBAction) do_about_menu_item: (id) sender
+{
+    [about_window makeKeyAndOrderFront: nil];
+}
+
+/* Create and display the about dialog */
+- (void)make_about_window
+{
+    /* Make the window */
+    int x = 0, y = 0, about_width = 400, about_height = 200;
+    NSRect window_rect = NSMakeRect(x, y, about_width, about_height);
+    about_window = [[NSWindow alloc] initWithContentRect:window_rect
+                    styleMask:NSTitledWindowMask | NSClosableWindowMask |
+                    NSMiniaturizableWindowMask
+                    backing:NSBackingStoreBuffered
+                    defer:NO];
+    [about_window setTitle: @"About"];
+    [about_window setReleasedWhenClosed: NO];
+    [about_window center];
+    NSView *superView = [about_window contentView];
+
+    /* Create the dimensions of the picture */
+    int picture_width = 80, picture_height = 80;
+    x = (about_width - picture_width)/2;
+    y = about_height - picture_height - 10;
+    NSRect picture_rect = NSMakeRect(x, y, picture_width, picture_height);
+
+    /* Get the path to the QEMU binary */
+    NSString *binary_name = [NSString stringWithCString: gArgv[0]
+                                      encoding: NSASCIIStringEncoding];
+    binary_name = [binary_name lastPathComponent];
+    NSString *program_path = [[NSString alloc] initWithFormat: @"%@/%@",
+    [[NSBundle mainBundle] bundlePath], binary_name];
+
+    /* Make the picture of QEMU */
+    NSImageView *picture_view = [[NSImageView alloc] initWithFrame:
+                                                     picture_rect];
+    NSImage *qemu_image = [[NSWorkspace sharedWorkspace] iconForFile:
+                                                         program_path];
+    [picture_view setImage: qemu_image];
+    [picture_view setImageScaling: NSScaleToFit];
+    [superView addSubview: picture_view];
+
+    /* Make the name label */
+    x = 0;
+    y = y - 25;
+    int name_width = about_width, name_height = 20;
+    NSRect name_rect = NSMakeRect(x, y, name_width, name_height);
+    NSTextField *name_label = [[NSTextField alloc] initWithFrame: name_rect];
+    [name_label setEditable: NO];
+    [name_label setBezeled: NO];
+    [name_label setDrawsBackground: NO];
+    [name_label setAlignment: NSCenterTextAlignment];
+    NSString *qemu_name = [[NSString alloc] initWithCString: gArgv[0]
+                                            encoding: NSASCIIStringEncoding];
+    qemu_name = [qemu_name lastPathComponent];
+    [name_label setStringValue: qemu_name];
+    [superView addSubview: name_label];
+
+    /* Set the version label's attributes */
+    x = 0;
+    y = 50;
+    int version_width = about_width, version_height = 20;
+    NSRect version_rect = NSMakeRect(x, y, version_width, version_height);
+    NSTextField *version_label = [[NSTextField alloc] initWithFrame:
+                                                      version_rect];
+    [version_label setEditable: NO];
+    [version_label setBezeled: NO];
+    [version_label setAlignment: NSCenterTextAlignment];
+    [version_label setDrawsBackground: NO];
+
+    /* Create the version string*/
+    NSString *version_string;
+    version_string = [[NSString alloc] initWithFormat:
+    @"QEMU emulator version %s %s", QEMU_VERSION, QEMU_PKGVERSION];
+    [version_label setStringValue: version_string];
+    [superView addSubview: version_label];
+
+    /* Make copyright label */
+    x = 0;
+    y = 35;
+    int copyright_width = about_width, copyright_height = 20;
+    NSRect copyright_rect = NSMakeRect(x, y, copyright_width, copyright_height);
+    NSTextField *copyright_label = [[NSTextField alloc] initWithFrame:
+                                                        copyright_rect];
+    [copyright_label setEditable: NO];
+    [copyright_label setBezeled: NO];
+    [copyright_label setDrawsBackground: NO];
+    [copyright_label setAlignment: NSCenterTextAlignment];
+    [copyright_label setStringValue:
+                     @"Copyright (c) 2003-2008 Fabrice Bellard"];
+    [superView addSubview: copyright_label];
+}
+
 @end
 
 
@@ -1185,7 +1286,7 @@ int main (int argc, const char * argv[]) {
 
     // Application menu
     menu = [[NSMenu alloc] initWithTitle:@""];
-    [menu addItemWithTitle:@"About QEMU" action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; // About QEMU
+    [menu addItemWithTitle:@"About QEMU" action:@selector(do_about_menu_item:) keyEquivalent:@""]; // About QEMU
     [menu addItem:[NSMenuItem separatorItem]]; //Separator
     [menu addItemWithTitle:@"Hide QEMU" action:@selector(hide:) keyEquivalent:@"h"]; //Hide QEMU
     menuItem = (NSMenuItem *)[menu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; // Hide Others
-- 
2.7.2

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [Qemu-devel] [PATCH v3] ui/cocoa.m: Make a better about dialog
  2016-07-29 15:16 [Qemu-devel] [PATCH v3] ui/cocoa.m: Make a better about dialog Programmingkid
@ 2016-08-15 21:31 ` Peter Maydell
  0 siblings, 0 replies; 2+ messages in thread
From: Peter Maydell @ 2016-08-15 21:31 UTC (permalink / raw)
  To: Programmingkid; +Cc: qemu-devel qemu-devel

On 29 July 2016 at 16:16, Programmingkid <programmingkidx@gmail.com> wrote:
> The about dialog in QEMU on Mac OS X is very plain and unhelpful. This patch
> makes the about dialog look a lot better and have some descriptive information
> on what version of QEMU the user is running.
>
> Signed-off-by: John Arbuckle <programmingkidx@gmail.com>

Thanks; this patch looks pretty good. I have a couple of minor
changes to suggest below.

Incidentally, while I was testing this I noticed that we
don't display the right icon for the "do you really
want to quit" alert box, but that's a separate bug.

> ---
> version 3 changes:
> Removed buffer related code
>
> version 2 changes:
> Added QEMU version to the version label
>
>  ui/cocoa.m | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 104 insertions(+), 3 deletions(-)
>
> diff --git a/ui/cocoa.m b/ui/cocoa.m
> index 36c6bf0..e17401b 100644
> --- a/ui/cocoa.m
> +++ b/ui/cocoa.m
> @@ -34,6 +34,7 @@
>  #include "qmp-commands.h"
>  #include "sysemu/blockdev.h"
>  #include <Carbon/Carbon.h>
> +#include "qemu-version.h"

Could you put this above the Carbon.h include so we have all
our qemu-local #includes in one place in the file, please?

>  #ifndef MAC_OS_X_VERSION_10_5
>  #define MAC_OS_X_VERSION_10_5 1050
> @@ -63,7 +64,7 @@ typedef struct {
>      int bitsPerPixel;
>  } QEMUScreen;
>
> -NSWindow *normalWindow;
> +NSWindow *normalWindow, *about_window;
>  static DisplayChangeListener *dcl;
>  static int last_buttons;
>
> @@ -670,7 +671,9 @@ QemuCocoaView *cocoaView;
>          case NSLeftMouseUp:
>              mouse_event = true;
>              if (!isMouseGrabbed && [self screenContainsPoint:p]) {
> -                [self grabMouse];
> +                if([[self window] isKeyWindow]) {
> +                    [self grabMouse];
> +                }
>              }
>              break;
>          case NSRightMouseUp:
> @@ -824,6 +827,8 @@ QemuCocoaView *cocoaView;
>  - (void)changeDeviceMedia:(id)sender;
>  - (BOOL)verifyQuit;
>  - (void)openDocumentation:(NSString *)filename;
> +- (IBAction) do_about_menu_item: (id) sender;
> +- (void)make_about_window;
>  @end
>
>  @implementation QemuCocoaAppController
> @@ -876,6 +881,7 @@ QemuCocoaView *cocoaView;
>          supportedImageFileTypes = [NSArray arrayWithObjects: @"img", @"iso", @"dmg",
>                                   @"qcow", @"qcow2", @"cloop", @"vmdk", @"cdr",
>                                    nil];
> +        [self make_about_window];
>      }
>      return self;
>  }
> @@ -1138,6 +1144,101 @@ QemuCocoaView *cocoaView;
>      }
>  }
>
> +/* The action method for the About menu item */
> +- (IBAction) do_about_menu_item: (id) sender
> +{
> +    [about_window makeKeyAndOrderFront: nil];
> +}
> +
> +/* Create and display the about dialog */
> +- (void)make_about_window
> +{
> +    /* Make the window */
> +    int x = 0, y = 0, about_width = 400, about_height = 200;
> +    NSRect window_rect = NSMakeRect(x, y, about_width, about_height);
> +    about_window = [[NSWindow alloc] initWithContentRect:window_rect
> +                    styleMask:NSTitledWindowMask | NSClosableWindowMask |
> +                    NSMiniaturizableWindowMask
> +                    backing:NSBackingStoreBuffered
> +                    defer:NO];
> +    [about_window setTitle: @"About"];
> +    [about_window setReleasedWhenClosed: NO];
> +    [about_window center];
> +    NSView *superView = [about_window contentView];
> +
> +    /* Create the dimensions of the picture */
> +    int picture_width = 80, picture_height = 80;
> +    x = (about_width - picture_width)/2;
> +    y = about_height - picture_height - 10;
> +    NSRect picture_rect = NSMakeRect(x, y, picture_width, picture_height);
> +
> +    /* Get the path to the QEMU binary */
> +    NSString *binary_name = [NSString stringWithCString: gArgv[0]
> +                                      encoding: NSASCIIStringEncoding];
> +    binary_name = [binary_name lastPathComponent];
> +    NSString *program_path = [[NSString alloc] initWithFormat: @"%@/%@",
> +    [[NSBundle mainBundle] bundlePath], binary_name];
> +
> +    /* Make the picture of QEMU */
> +    NSImageView *picture_view = [[NSImageView alloc] initWithFrame:
> +                                                     picture_rect];
> +    NSImage *qemu_image = [[NSWorkspace sharedWorkspace] iconForFile:
> +                                                         program_path];
> +    [picture_view setImage: qemu_image];
> +    [picture_view setImageScaling: NSScaleToFit];

This causes a deprecation warning in 10.10 I'm afraid:

/Users/pm215/src/qemu/ui/cocoa.m:1188:36: warning: 'NSScaleToFit' is
deprecated: first deprecated in OS X 10.10 - Use
NSImageScaleAxesIndependently instead
      [-Wdeprecated-declarations]
    [picture_view setImageScaling: NSScaleToFit];
                                   ^
/System/Library/Frameworks/AppKit.framework/Headers/NSCell.h:64:5:
note: 'NSScaleToFit' has been explicitly marked deprecated here
    NSScaleToFit NS_ENUM_DEPRECATED_MAC(10_0, 10_10, "Use
NSImageScaleAxesIndependently instead"),
    ^

I think we want NSImageScaleProportionallyUpOrDown,
in fact, since distorting the icon isn't what we're after.
That's in OSX 10.5+ so we can just use it unconditionally.

(I don't suppose we have a copy of the icon that's at a
larger size so we don't need to scale it up, do we?)

> +    [superView addSubview: picture_view];
> +
> +    /* Make the name label */
> +    x = 0;
> +    y = y - 25;
> +    int name_width = about_width, name_height = 20;
> +    NSRect name_rect = NSMakeRect(x, y, name_width, name_height);
> +    NSTextField *name_label = [[NSTextField alloc] initWithFrame: name_rect];
> +    [name_label setEditable: NO];
> +    [name_label setBezeled: NO];
> +    [name_label setDrawsBackground: NO];
> +    [name_label setAlignment: NSCenterTextAlignment];
> +    NSString *qemu_name = [[NSString alloc] initWithCString: gArgv[0]
> +                                            encoding: NSASCIIStringEncoding];
> +    qemu_name = [qemu_name lastPathComponent];
> +    [name_label setStringValue: qemu_name];
> +    [superView addSubview: name_label];
> +
> +    /* Set the version label's attributes */
> +    x = 0;
> +    y = 50;
> +    int version_width = about_width, version_height = 20;
> +    NSRect version_rect = NSMakeRect(x, y, version_width, version_height);
> +    NSTextField *version_label = [[NSTextField alloc] initWithFrame:
> +                                                      version_rect];
> +    [version_label setEditable: NO];
> +    [version_label setBezeled: NO];
> +    [version_label setAlignment: NSCenterTextAlignment];
> +    [version_label setDrawsBackground: NO];
> +
> +    /* Create the version string*/
> +    NSString *version_string;
> +    version_string = [[NSString alloc] initWithFormat:
> +    @"QEMU emulator version %s %s", QEMU_VERSION, QEMU_PKGVERSION];

No space between the QEMU_VERSION and QEMU_PKGVERSION strings,
for consistency with how we display this elsewhere. (Generally
the QEMU_PKGVERSION is either a "-some-suffix" format or
includes a space like " (stuff here)" so this doesn't look odd.)

> +    [version_label setStringValue: version_string];
> +    [superView addSubview: version_label];
> +
> +    /* Make copyright label */
> +    x = 0;
> +    y = 35;
> +    int copyright_width = about_width, copyright_height = 20;
> +    NSRect copyright_rect = NSMakeRect(x, y, copyright_width, copyright_height);
> +    NSTextField *copyright_label = [[NSTextField alloc] initWithFrame:
> +                                                        copyright_rect];
> +    [copyright_label setEditable: NO];
> +    [copyright_label setBezeled: NO];
> +    [copyright_label setDrawsBackground: NO];
> +    [copyright_label setAlignment: NSCenterTextAlignment];
> +    [copyright_label setStringValue:
> +                     @"Copyright (c) 2003-2008 Fabrice Bellard"];

If you rebase against current master you'll find that it now defines
a QEMU_COPYRIGHT #define which has a copyright string in it, so
you can use that here.

> +    [superView addSubview: copyright_label];
> +}
> +
>  @end
>
>
> @@ -1185,7 +1286,7 @@ int main (int argc, const char * argv[]) {
>
>      // Application menu
>      menu = [[NSMenu alloc] initWithTitle:@""];
> -    [menu addItemWithTitle:@"About QEMU" action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; // About QEMU
> +    [menu addItemWithTitle:@"About QEMU" action:@selector(do_about_menu_item:) keyEquivalent:@""]; // About QEMU
>      [menu addItem:[NSMenuItem separatorItem]]; //Separator
>      [menu addItemWithTitle:@"Hide QEMU" action:@selector(hide:) keyEquivalent:@"h"]; //Hide QEMU
>      menuItem = (NSMenuItem *)[menu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; // Hide Others
> --
> 2.7.2

thanks
-- PMM

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-08-15 21:32 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-07-29 15:16 [Qemu-devel] [PATCH v3] ui/cocoa.m: Make a better about dialog Programmingkid
2016-08-15 21:31 ` Peter Maydell

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.