Module: wine Branch: master Commit: 4db8fc394d769b231bf3dc45b89a1ec4906effe1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4db8fc394d769b231bf3dc45b8...
Author: Ken Thomases ken@codeweavers.com Date: Mon Nov 2 19:23:04 2015 -0600
winemac: Cope with multiple seemingly-identical display modes, only some of which work, by trying them in sequence.
Signed-off-by: Ken Thomases ken@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winemac.drv/cocoa_app.m | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m index 7f6ca23..c0581b8 100644 --- a/dlls/winemac.drv/cocoa_app.m +++ b/dlls/winemac.drv/cocoa_app.m @@ -699,9 +699,9 @@ int macdrv_err_on; return TRUE; }
- - (CGDisplayModeRef)modeMatchingMode:(CGDisplayModeRef)mode forDisplay:(CGDirectDisplayID)displayID + - (NSArray*)modesMatchingMode:(CGDisplayModeRef)mode forDisplay:(CGDirectDisplayID)displayID { - CGDisplayModeRef ret = NULL; + NSMutableArray* ret = [NSMutableArray array]; NSDictionary* options = nil;
#if defined(MAC_OS_X_VERSION_10_8) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 @@ -715,10 +715,7 @@ int macdrv_err_on; { CGDisplayModeRef candidateMode = (CGDisplayModeRef)candidateModeObject; if ([self mode:candidateMode matchesMode:mode]) - { - ret = candidateMode; - break; - } + [ret addObject:candidateModeObject]; } return ret; } @@ -743,11 +740,15 @@ int macdrv_err_on; } else // ... otherwise, try to restore just the one display { - mode = [self modeMatchingMode:mode forDisplay:displayID]; - if (mode && CGDisplaySetDisplayMode(displayID, mode, NULL) == CGDisplayNoErr) + for (id modeObject in [self modesMatchingMode:mode forDisplay:displayID]) { - [originalDisplayModes removeObjectForKey:displayIDKey]; - ret = TRUE; + mode = (CGDisplayModeRef)modeObject; + if (CGDisplaySetDisplayMode(displayID, mode, NULL) == CGDisplayNoErr) + { + [originalDisplayModes removeObjectForKey:displayIDKey]; + ret = TRUE; + break; + } } } } @@ -755,6 +756,7 @@ int macdrv_err_on; { BOOL active = [NSApp isActive]; CGDisplayModeRef currentMode; + NSArray* modes;
currentMode = CGDisplayModeRetain((CGDisplayModeRef)[latentDisplayModes objectForKey:displayIDKey]); if (!currentMode) @@ -771,8 +773,8 @@ int macdrv_err_on; CGDisplayModeRelease(currentMode); currentMode = NULL;
- mode = [self modeMatchingMode:mode forDisplay:displayID]; - if (!mode) + modes = [self modesMatchingMode:mode forDisplay:displayID]; + if (!modes.count) return FALSE;
if ([originalDisplayModes count] || displaysCapturedForFullscreen || @@ -789,7 +791,17 @@ int macdrv_err_on; originalMode = currentMode = CGDisplayCopyDisplayMode(displayID);
if (originalMode) - ret = (CGDisplaySetDisplayMode(displayID, mode, NULL) == CGDisplayNoErr); + { + for (id modeObject in modes) + { + mode = (CGDisplayModeRef)modeObject; + if (CGDisplaySetDisplayMode(displayID, mode, NULL) == CGDisplayNoErr) + { + ret = TRUE; + break; + } + } + } if (ret && !(currentMode && [self mode:mode matchesMode:currentMode])) [originalDisplayModes setObject:(id)originalMode forKey:displayIDKey]; else if (![originalDisplayModes count])