From patchwork Wed Jan 21 19:25:03 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Programmingkid X-Patchwork-Id: 431584 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id E5B60140295 for ; Thu, 22 Jan 2015 06:25:37 +1100 (AEDT) Received: from localhost ([::1]:49871 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YE0uE-0002MY-2u for incoming@patchwork.ozlabs.org; Wed, 21 Jan 2015 14:25:34 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56824) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YE0ts-00025H-Fl for qemu-devel@nongnu.org; Wed, 21 Jan 2015 14:25:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YE0tn-00041V-9n for qemu-devel@nongnu.org; Wed, 21 Jan 2015 14:25:12 -0500 Received: from mail-qc0-x22e.google.com ([2607:f8b0:400d:c01::22e]:61531) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YE0tn-0003ye-4a for qemu-devel@nongnu.org; Wed, 21 Jan 2015 14:25:07 -0500 Received: by mail-qc0-f174.google.com with SMTP id s11so17331633qcv.5 for ; Wed, 21 Jan 2015 11:25:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=content-type:mime-version:subject:from:date:cc :content-transfer-encoding:message-id:references:to; bh=yriuSdrD/ejNVtM0l/v4cUGxjJe/S5JIkGX9EvJ30fg=; b=KJfdg4+YvJoqRG5WiXDXR384vuaZooUgBoP+cBbt6hV9uhh+bCI5ENcRjttMPLR/D1 QNJDExdlqtMNWhnpySHC/6oWEMAIOZGtIAPpMqm3U7zPh6sY7TV7MUt3Zbhxnd9+HFia krNnCC3ul/nK0ofXjjX7yeiKb7iqHGV9MOnQQ1BLVzlS78oHwAff9I+qxuWouH9ZBROp xmPyRkJwrZRxhhAqvA0wvgKiehT30nUN/3fEgNtSyLEHm4I1GLe81JFrYJVq/s3Zyf0s KFbV/tG4WGAdLsw6ZSVWLYAh4DOg5MC/K3IaA5k5zaMrbel3shLJwaZ3/q047Z9C6Fhp moRQ== X-Received: by 10.140.48.105 with SMTP id n96mr66784542qga.17.1421868306013; Wed, 21 Jan 2015 11:25:06 -0800 (PST) Received: from [192.168.0.2] (d199-74-164-53.col.wideopenwest.com. [74.199.53.164]) by mx.google.com with ESMTPSA id c9sm4161416qas.37.2015.01.21.11.25.04 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 21 Jan 2015 11:25:05 -0800 (PST) Mime-Version: 1.0 (Apple Message framework v1084) From: Programmingkid Date: Wed, 21 Jan 2015 14:25:03 -0500 Message-Id: References: To: Peter Maydell X-Mailer: Apple Mail (2.1084) X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:400d:c01::22e Cc: qemu-devel qemu-devel Subject: [Qemu-devel] [PATCH v3] Fixes several full screen issues on Mac OS X X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This patch makes several changes: - Minimizes distorted full screen display by respecting aspect ratios. - Makes full screen mode available on Mac OS 10.7 and higher. - Allows user to decide if video should be stretched to fill the screen, using a menu item called "Zoom To Fit". - Hides the normalWindow so it won't show up in full screen mode. - Allows user to exit full screen mode. Signed-off-by: John Arbuckle --- Changes in version 2: - Completely rewritten. - Eliminated depreciated API's. - Does not change host monitor resolution. Change in version 3: - Fixed full screen window not receiving mouse moved events. ui/cocoa.m | 49 ++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 44 insertions(+), 5 deletions(-) diff --git a/ui/cocoa.m b/ui/cocoa.m index d37c29b..35ab195 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -64,6 +64,7 @@ static int last_buttons; int gArgc; char **gArgv; +bool stretch_video; // keymap conversion int keymap[] = @@ -414,10 +415,21 @@ QemuCocoaView *cocoaView; - (void) setContentDimensions { COCOA_DEBUG("QemuCocoaView: setContentDimensions\n"); - if (isFullscreen) { cdx = [[NSScreen mainScreen] frame].size.width / (float)screen.width; cdy = [[NSScreen mainScreen] frame].size.height / (float)screen.height; + + /* stretches video, but keeps same aspect ratio */ + if(stretch_video == true) { + /* use smallest stretch value - prevents clipping on sides */ + if (MIN(cdx, cdy) == cdx) { + cdy = cdx; + } else { + cdx = cdy; + } + } else { /* No stretching */ + cdx = cdy = 1; + } cw = screen.width * cdx; ch = screen.height * cdy; cx = ([[NSScreen mainScreen] frame].size.width - cw) / 2.0; @@ -502,6 +514,7 @@ QemuCocoaView *cocoaView; #endif } else { // switch from desktop to fullscreen isFullscreen = TRUE; + [normalWindow orderOut: nil]; /* Hide the window */ [self grabMouse]; [self setContentDimensions]; // test if host supports "enterFullScreenMode:withOptions" at compile time @@ -518,8 +531,11 @@ QemuCocoaView *cocoaView; styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; + [fullScreenWindow setAcceptsMouseMovedEvents: YES]; [fullScreenWindow setHasShadow:NO]; - [fullScreenWindow setContentView:self]; + [fullScreenWindow setBackgroundColor: [NSColor blackColor]]; + [self setFrame:NSMakeRect(cx, cy, cw, ch)]; + [[fullScreenWindow contentView] addSubview: self]; [fullScreenWindow makeKeyAndOrderFront:self]; #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) } @@ -561,7 +577,7 @@ QemuCocoaView *cocoaView; } // release Mouse grab when pressing ctrl+alt - if (!isFullscreen && ([event modifierFlags] & NSControlKeyMask) && ([event modifierFlags] & NSAlternateKeyMask)) { + if (([event modifierFlags] & NSControlKeyMask) && ([event modifierFlags] & NSAlternateKeyMask)) { [self ungrabMouse]; } break; @@ -798,9 +814,11 @@ QemuCocoaView *cocoaView; } - (void)startEmulationWithArgc:(int)argc argv:(char**)argv; - (void)openPanelDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; +- (void)doToggleFullScreen:(id)sender; - (void)toggleFullScreen:(id)sender; - (void)showQEMUDoc:(id)sender; - (void)showQEMUTec:(id)sender; +- (void)zoomToFit:(id) sender; @end @implementation QemuCocoaAppController @@ -832,7 +850,7 @@ QemuCocoaView *cocoaView; [normalWindow useOptimizedDrawing:YES]; [normalWindow makeKeyAndOrderFront:self]; [normalWindow center]; - + stretch_video = false; } return self; } @@ -921,6 +939,15 @@ QemuCocoaView *cocoaView; [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: */ +- (void) doToggleFullScreen:(id)sender +{ + [self toggleFullScreen:(id)sender]; +} + - (void)toggleFullScreen:(id)sender { COCOA_DEBUG("QemuCocoaAppController: toggleFullScreen\n"); @@ -943,6 +970,17 @@ QemuCocoaView *cocoaView; [[NSWorkspace sharedWorkspace] openFile:[NSString stringWithFormat:@"%@/../doc/qemu/qemu-tech.html", [[NSBundle mainBundle] resourcePath]] withApplication:@"Help Viewer"]; } + +/* Stretches video to fit host monitor size */ +- (void)zoomToFit:(id) sender +{ + stretch_video = !stretch_video; + if (stretch_video == true) { + [sender setState: NSOnState]; + } else { + [sender setState: NSOffState]; + } +} @end @@ -1005,7 +1043,8 @@ int main (int argc, const char * argv[]) { // View menu menu = [[NSMenu alloc] initWithTitle:@"View"]; - [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"Enter Fullscreen" action:@selector(toggleFullScreen:) keyEquivalent:@"f"] autorelease]]; // Fullscreen + [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"Enter Fullscreen" action:@selector(doToggleFullScreen:) keyEquivalent:@"f"] autorelease]]; // Fullscreen + [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"Zoom To Fit" action:@selector(zoomToFit:) keyEquivalent:@"f"] autorelease]]; menuItem = [[[NSMenuItem alloc] initWithTitle:@"View" action:nil keyEquivalent:@""] autorelease]; [menuItem setSubmenu:menu]; [[NSApp mainMenu] addItem:menuItem];