Module: wine
Branch: master
Commit: dbb0bacf6731304f074f492438982949449a5266
URL: http://source.winehq.org/git/wine.git/?a=commit;h=dbb0bacf6731304f074f49243…
Author: Ken Thomases <ken(a)codeweavers.com>
Date: Mon Oct 26 23:39:06 2015 -0500
winemac: Fix how the user's default display mode is determined.
The code had been checking the kDisplayModeDefaultFlag in the mode's IOFlags,
but that doesn't do what I thought. That indicates which mode the driver
considers to be the default for the hardware. It turns out there's no way to
query the user's default mode.
So, at the first opportunity during a given Wine session, the Mac driver
queries the current display mode and assumes that's the user's default mode.
It records that in a volatile registry key for use by subsequent processes
during that same session.
This doesn't use the existing registry key under
HKEY_CURRENT_CONFIG\System\CurrentControlSet\Control\Video that records the
mode when CDS_UPDATEREGISTRY is used with ChangeDisplaySettingsEx() -- which
explorer.exe does during start-up -- because a) that doesn't support the
distinction between pixel size and point size for Retina modes, and b) in
theory, apps could overwrite that.
Signed-off-by: Ken Thomases <ken(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
dlls/winemac.drv/display.c | 282 ++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 278 insertions(+), 4 deletions(-)
Diff: http://source.winehq.org/git/wine.git/?a=commitdiff;h=dbb0bacf6731304f074f4…
Module: wine
Branch: master
Commit: 02c6676864b0af2f0d6c999aec66c9bcba9b0a15
URL: http://source.winehq.org/git/wine.git/?a=commit;h=02c6676864b0af2f0d6c999ae…
Author: Ken Thomases <ken(a)codeweavers.com>
Date: Mon Oct 26 23:39:05 2015 -0500
winemac: Reorganize copy_display_modes() to clarify that the user's default mode is always included.
Signed-off-by: Ken Thomases <ken(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
dlls/winemac.drv/display.c | 95 +++++++++++++++++++++++-----------------------
1 file changed, 48 insertions(+), 47 deletions(-)
diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c
index 10ecf67..d561e68 100644
--- a/dlls/winemac.drv/display.c
+++ b/dlls/winemac.drv/display.c
@@ -312,63 +312,64 @@ static CFArrayRef copy_display_modes(CGDirectDisplayID display)
BOOL better = TRUE;
CGDisplayModeRef new_mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i);
uint32_t new_flags = CGDisplayModeGetIOFlags(new_mode);
- CFStringRef pixel_encoding;
- size_t width_points;
- size_t height_points;
- CFDictionaryRef key;
- CGDisplayModeRef old_mode;
+ CFDictionaryRef key = create_mode_dict(new_mode);
- if (!(new_flags & kDisplayModeDefaultFlag) && (pixel_encoding = CGDisplayModeCopyPixelEncoding(new_mode)))
+ /* If a given mode is the user's default, then always list it in preference to any similar
+ modes that may exist. */
+ if (new_flags & kDisplayModeDefaultFlag)
+ better = TRUE;
+ else
{
- BOOL bpp30 = CFEqual(pixel_encoding, CFSTR(kIO30BitDirectPixels));
- CFRelease(pixel_encoding);
- if (bpp30)
+ CFStringRef pixel_encoding = CGDisplayModeCopyPixelEncoding(new_mode);
+ CGDisplayModeRef old_mode;
+
+ if (pixel_encoding)
{
- /* This is an odd pixel encoding. It seems it's only returned
- when using kCGDisplayShowDuplicateLowResolutionModes. It's
- 32bpp in terms of the actual raster layout, but it's 10
- bits per component. I think that no Windows program is
- likely to need it and they will probably be confused by it.
- Skip it. */
- continue;
+ BOOL bpp30 = CFEqual(pixel_encoding, CFSTR(kIO30BitDirectPixels));
+ CFRelease(pixel_encoding);
+ if (bpp30)
+ {
+ /* This is an odd pixel encoding. It seems it's only returned
+ when using kCGDisplayShowDuplicateLowResolutionModes. It's
+ 32bpp in terms of the actual raster layout, but it's 10
+ bits per component. I think that no Windows program is
+ likely to need it and they will probably be confused by it.
+ Skip it. */
+ CFRelease(key);
+ continue;
+ }
}
- }
-
- width_points = CGDisplayModeGetWidth(new_mode);
- height_points = CGDisplayModeGetHeight(new_mode);
- key = create_mode_dict(new_mode);
- old_mode = (CGDisplayModeRef)CFDictionaryGetValue(modes_by_size, key);
- if (old_mode)
- {
- uint32_t old_flags = CGDisplayModeGetIOFlags(old_mode);
-
- /* If a given mode is the user's default, then always list it in preference to any similar
- modes that may exist. */
- if ((new_flags & kDisplayModeDefaultFlag) && !(old_flags & kDisplayModeDefaultFlag))
- better = TRUE;
- else if (!(new_flags & kDisplayModeDefaultFlag) && (old_flags & kDisplayModeDefaultFlag))
- better = FALSE;
- else
+ old_mode = (CGDisplayModeRef)CFDictionaryGetValue(modes_by_size, key);
+ if (old_mode)
{
- /* Otherwise, prefer a mode whose pixel size equals its point size over one which
- is scaled. */
- size_t new_width_pixels = CGDisplayModeGetPixelWidth(new_mode);
- size_t new_height_pixels = CGDisplayModeGetPixelHeight(new_mode);
- size_t old_width_pixels = CGDisplayModeGetPixelWidth(old_mode);
- size_t old_height_pixels = CGDisplayModeGetPixelHeight(old_mode);
- BOOL new_size_same = (new_width_pixels == width_points && new_height_pixels == height_points);
- BOOL old_size_same = (old_width_pixels == width_points && old_height_pixels == height_points);
-
- if (new_size_same && !old_size_same)
- better = TRUE;
- else if (!new_size_same && old_size_same)
+ uint32_t old_flags = CGDisplayModeGetIOFlags(old_mode);
+
+ if (old_flags & kDisplayModeDefaultFlag)
better = FALSE;
else
{
- /* Otherwise, prefer the mode with the smaller pixel size. */
- if (old_width_pixels < new_width_pixels || old_height_pixels < new_height_pixels)
+ /* Otherwise, prefer a mode whose pixel size equals its point size over one which
+ is scaled. */
+ size_t width_points = CGDisplayModeGetWidth(new_mode);
+ size_t height_points = CGDisplayModeGetHeight(new_mode);
+ size_t new_width_pixels = CGDisplayModeGetPixelWidth(new_mode);
+ size_t new_height_pixels = CGDisplayModeGetPixelHeight(new_mode);
+ size_t old_width_pixels = CGDisplayModeGetPixelWidth(old_mode);
+ size_t old_height_pixels = CGDisplayModeGetPixelHeight(old_mode);
+ BOOL new_size_same = (new_width_pixels == width_points && new_height_pixels == height_points);
+ BOOL old_size_same = (old_width_pixels == width_points && old_height_pixels == height_points);
+
+ if (new_size_same && !old_size_same)
+ better = TRUE;
+ else if (!new_size_same && old_size_same)
better = FALSE;
+ else
+ {
+ /* Otherwise, prefer the mode with the smaller pixel size. */
+ if (old_width_pixels < new_width_pixels || old_height_pixels < new_height_pixels)
+ better = FALSE;
+ }
}
}
}