winemac: Don't assume the current display mode is the original if we don't have the displays captured.

Another process may have changed the display mode before we queried the
current mode, so we may be seeing a non-original mode.
This commit is contained in:
Ken Thomases 2014-01-10 03:11:25 -06:00 committed by Alexandre Julliard
parent fe1c0ab952
commit 9c65d672a2
1 changed files with 18 additions and 10 deletions

View File

@ -726,18 +726,16 @@ - (BOOL) setMode:(CGDisplayModeRef)mode forDisplay:(CGDirectDisplayID)displayID
return TRUE;
}
CGDisplayModeRelease(currentMode);
currentMode = NULL;
mode = [self modeMatchingMode:mode forDisplay:displayID];
if (!mode)
{
CGDisplayModeRelease(currentMode);
return FALSE;
}
originalMode = (CGDisplayModeRef)[originalDisplayModes objectForKey:displayIDKey];
if (!originalMode)
originalMode = currentMode;
if ([self mode:mode matchesMode:originalMode])
if (originalMode && [self mode:mode matchesMode:originalMode])
{
if ([originalDisplayModes count] == 1) // If this is the last changed display, do a blanket reset
{
@ -771,8 +769,17 @@ - (BOOL) setMode:(CGDisplayModeRef)mode forDisplay:(CGDirectDisplayID)displayID
{
if (active)
{
ret = (CGDisplaySetDisplayMode(displayID, mode, NULL) == CGDisplayNoErr);
if (ret)
// If we get here, we have the displays captured. If we don't
// know the original mode of the display, the current mode must
// be the original. We should re-query the current mode since
// another process could have changed it between when we last
// checked and when we captured the displays.
if (!originalMode)
originalMode = currentMode = CGDisplayCopyDisplayMode(displayID);
if (originalMode)
ret = (CGDisplaySetDisplayMode(displayID, mode, NULL) == CGDisplayNoErr);
if (ret && !(currentMode && [self mode:mode matchesMode:currentMode]))
[originalDisplayModes setObject:(id)originalMode forKey:displayIDKey];
else if (![originalDisplayModes count])
{
@ -781,6 +788,9 @@ - (BOOL) setMode:(CGDisplayModeRef)mode forDisplay:(CGDirectDisplayID)displayID
if (!displaysCapturedForFullscreen)
CGReleaseAllDisplays();
}
if (currentMode)
CGDisplayModeRelease(currentMode);
}
else
{
@ -790,8 +800,6 @@ - (BOOL) setMode:(CGDisplayModeRef)mode forDisplay:(CGDirectDisplayID)displayID
}
}
CGDisplayModeRelease(currentMode);
if (ret)
[self adjustWindowLevels];