[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2] Fixes several full screen issues on Mac OS X
From: |
Programmingkid |
Subject: |
[Qemu-devel] [PATCH v2] Fixes several full screen issues on Mac OS X |
Date: |
Tue, 20 Jan 2015 23:21:52 -0500 |
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 <address@hidden>
---
Completely rewritten.
Eliminated depreciated API's.
Does not change host monitor resolution.
ui/cocoa.m | 48 +++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 43 insertions(+), 5 deletions(-)
diff --git a/ui/cocoa.m b/ui/cocoa.m
index d37c29b..843a9ce 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: self]; /* Hide the window */
[self grabMouse];
[self setContentDimensions];
// test if host supports "enterFullScreenMode:withOptions" at compile time
@@ -519,7 +532,9 @@ QemuCocoaView *cocoaView;
backing:NSBackingStoreBuffered
defer:NO];
[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 +576,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 +813,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 +849,7 @@ QemuCocoaView *cocoaView;
[normalWindow useOptimizedDrawing:YES];
[normalWindow makeKeyAndOrderFront:self];
[normalWindow center];
-
+ stretch_video = false;
}
return self;
}
@@ -921,6 +938,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 +969,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 +1042,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];
--
1.7.5.4
- [Qemu-devel] [PATCH v2] Fixes several full screen issues on Mac OS X,
Programmingkid <=