Message ID | 5F2AE1F2-649D-47EB-B8B9-22A75F88C209@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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
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
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(-)