Ken Thomases : winemac: For ChangeDisplaySettingsEx(), if caller didn' t specify, prefer non-interlaced and unstretched modes.

Alexandre Julliard julliard at winehq.org
Fri Jan 10 13:22:45 CST 2014


Module: wine
Branch: master
Commit: c072a4564e55d38b3279e598a0b4a276639ab5d8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c072a4564e55d38b3279e598a0b4a276639ab5d8

Author: Ken Thomases <ken at codeweavers.com>
Date:   Fri Jan 10 03:11:36 2014 -0600

winemac: For ChangeDisplaySettingsEx(), if caller didn't specify, prefer non-interlaced and unstretched modes.

---

 dlls/winemac.drv/display.c |   72 +++++++++++++++++++++++++++++---------------
 1 file changed, 48 insertions(+), 24 deletions(-)

diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c
index e44415d..2f801f0 100644
--- a/dlls/winemac.drv/display.c
+++ b/dlls/winemac.drv/display.c
@@ -235,7 +235,9 @@ LONG CDECL macdrv_ChangeDisplaySettingsEx(LPCWSTR devname, LPDEVMODEW devmode,
     struct macdrv_display *displays;
     int num_displays;
     CFArrayRef display_modes;
-    CFIndex count, i, safe;
+    CFIndex count, i, safe, best;
+    CGDisplayModeRef best_display_mode;
+    uint32_t best_io_flags;
 
     TRACE("%s %p %p 0x%08x %p\n", debugstr_w(devname), devmode, hwnd, flags, lpvoid);
 
@@ -299,6 +301,7 @@ LONG CDECL macdrv_ChangeDisplaySettingsEx(LPCWSTR devname, LPDEVMODEW devmode,
     TRACE("\n");
 
     safe = -1;
+    best_display_mode = NULL;
     count = CFArrayGetCount(display_modes);
     for (i = 0; i < count; i++)
     {
@@ -334,57 +337,78 @@ LONG CDECL macdrv_ChangeDisplaySettingsEx(LPCWSTR devname, LPDEVMODEW devmode,
             if (devmode->dmDisplayFrequency != (DWORD)refresh_rate)
                 continue;
         }
+        if (devmode->dmFields & DM_DISPLAYFLAGS)
+        {
+            if (!(devmode->dmDisplayFlags & DM_INTERLACED) != !(io_flags & kDisplayModeInterlacedFlag))
+                continue;
+        }
+        else if (best_display_mode)
+        {
+            if (io_flags & kDisplayModeInterlacedFlag && !(best_io_flags & kDisplayModeInterlacedFlag))
+                continue;
+            else if (!(io_flags & kDisplayModeInterlacedFlag) && best_io_flags & kDisplayModeInterlacedFlag)
+                goto better;
+        }
         if (devmode->dmFields & DM_DISPLAYFIXEDOUTPUT)
         {
             if (!(devmode->dmDisplayFixedOutput == DMDFO_STRETCH) != !(io_flags & kDisplayModeStretchedFlag))
                 continue;
         }
-        if (devmode->dmFields & DM_DISPLAYFLAGS)
+        else if (best_display_mode)
         {
-            if (!(devmode->dmDisplayFlags & DM_INTERLACED) != !(io_flags & kDisplayModeInterlacedFlag))
+            if (io_flags & kDisplayModeStretchedFlag && !(best_io_flags & kDisplayModeStretchedFlag))
                 continue;
+            else if (!(io_flags & kDisplayModeStretchedFlag) && best_io_flags & kDisplayModeStretchedFlag)
+                goto better;
         }
 
+        if (best_display_mode)
+            continue;
+
+better:
+        best_display_mode = display_mode;
+        best = safe;
+        best_io_flags = io_flags;
+    }
+
+    if (best_display_mode)
+    {
         /* we have a valid mode */
-        TRACE("Requested display settings match mode %ld\n", safe);
+        TRACE("Requested display settings match mode %ld\n", best);
 
         if ((flags & CDS_UPDATEREGISTRY) && !write_registry_settings(devmode))
         {
             WARN("Failed to update registry\n");
             ret = DISP_CHANGE_NOTUPDATED;
-            break;
         }
+        else if (flags & (CDS_TEST | CDS_NORESET))
+            ret = DISP_CHANGE_SUCCESSFUL;
+        else if (macdrv_set_display_mode(&displays[0], best_display_mode))
+        {
+            int mode_bpp = display_mode_bits_per_pixel(best_display_mode);
+            size_t width = CGDisplayModeGetWidth(best_display_mode);
+            size_t height = CGDisplayModeGetHeight(best_display_mode);
 
-        if (flags & (CDS_TEST | CDS_NORESET))
+            SendMessageW(GetDesktopWindow(), WM_MACDRV_UPDATE_DESKTOP_RECT, mode_bpp,
+                         MAKELPARAM(width, height));
             ret = DISP_CHANGE_SUCCESSFUL;
+        }
         else
         {
-            if (macdrv_set_display_mode(&displays[0], display_mode))
-            {
-                SendMessageW(GetDesktopWindow(), WM_MACDRV_UPDATE_DESKTOP_RECT, mode_bpp,
-                             MAKELPARAM(width, height));
-                ret = DISP_CHANGE_SUCCESSFUL;
-            }
-            else
-            {
-                WARN("Failed to set display mode\n");
-                ret = DISP_CHANGE_FAILED;
-            }
+            WARN("Failed to set display mode\n");
+            ret = DISP_CHANGE_FAILED;
         }
-
-        break;
     }
-
-    CFRelease(display_modes);
-    macdrv_free_displays(displays);
-
-    if (i >= count)
+    else
     {
         /* no valid modes found */
         ERR("No matching mode found %ux%ux%d @%u!\n", devmode->dmPelsWidth, devmode->dmPelsHeight,
             bpp, devmode->dmDisplayFrequency);
     }
 
+    CFRelease(display_modes);
+    macdrv_free_displays(displays);
+
     return ret;
 }
 




More information about the wine-cvs mailing list