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>
This commit is contained in:
parent
2dc5685897
commit
4db8fc394d
|
@ -699,9 +699,9 @@ - (BOOL) mode:(CGDisplayModeRef)mode1 matchesMode:(CGDisplayModeRef)mode2
|
|||
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 @@ - (CGDisplayModeRef)modeMatchingMode:(CGDisplayModeRef)mode forDisplay:(CGDirect
|
|||
{
|
||||
CGDisplayModeRef candidateMode = (CGDisplayModeRef)candidateModeObject;
|
||||
if ([self mode:candidateMode matchesMode:mode])
|
||||
{
|
||||
ret = candidateMode;
|
||||
break;
|
||||
}
|
||||
[ret addObject:candidateModeObject];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -743,11 +740,15 @@ - (BOOL) setMode:(CGDisplayModeRef)mode forDisplay:(CGDirectDisplayID)displayID
|
|||
}
|
||||
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 @@ - (BOOL) setMode:(CGDisplayModeRef)mode forDisplay:(CGDirectDisplayID)displayID
|
|||
{
|
||||
BOOL active = [NSApp isActive];
|
||||
CGDisplayModeRef currentMode;
|
||||
NSArray* modes;
|
||||
|
||||
currentMode = CGDisplayModeRetain((CGDisplayModeRef)[latentDisplayModes objectForKey:displayIDKey]);
|
||||
if (!currentMode)
|
||||
|
@ -771,8 +773,8 @@ - (BOOL) setMode:(CGDisplayModeRef)mode forDisplay:(CGDirectDisplayID)displayID
|
|||
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 @@ - (BOOL) setMode:(CGDisplayModeRef)mode forDisplay:(CGDirectDisplayID)displayID
|
|||
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])
|
||||
|
|
Loading…
Reference in New Issue