user32, wined3d: move refresh rate fallback to catch all cases (resend)

Erik Inge Bolsø knan-wine at anduin.net
Mon Jan 14 15:06:27 CST 2008


If requesting a refresh rate that isn't available, but a better one is, 
ChangeDisplaySettings fails and some games fail to launch. This does 
not seem to match WinXP behaviour with the same graphics card + lcd 
monitor combination.

Pushing the refresh rate retry up a level fixes my case (1024x768 at 50Hz, 
hardcoded).

(http://appdb.winehq.org/objectManager.php?sClass=version&iId=5618)

---
 dlls/user32/sysparams.c |   13 ++++++++++++-
 dlls/wined3d/device.c   |   10 +---------
 2 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index c5de419..0a61afb 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -3010,10 +3010,21 @@ LONG WINAPI ChangeDisplaySettingsExA( LPCSTR devname, LPDEVMODEA devmode, HWND h
 LONG WINAPI ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode, HWND hwnd,
                                       DWORD flags, LPVOID lparam )
 {
+    LONG ret;
+
     /* make sure the desktop window is created before mode changing */
     GetDesktopWindow();
 
-    return USER_Driver->pChangeDisplaySettingsEx( devname, devmode, hwnd, flags, lparam );
+    ret = USER_Driver->pChangeDisplaySettingsEx( devname, devmode, hwnd, flags, lparam );
+    if (ret != DISP_CHANGE_SUCCESSFUL) {
+        if(devmode->dmDisplayFrequency != 0) {
+            WARN("ChangeDisplaySettingsEx failed, retrying without specified refresh rate\n");
+            devmode->dmFields &= ~DM_DISPLAYFREQUENCY;
+            devmode->dmDisplayFrequency = 0;
+            ret = USER_Driver->pChangeDisplaySettingsEx( devname, devmode, hwnd, flags, lparam );
+	}
+    }
+    return ret;
 }
 
 
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index ac418d9..fa4df02 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -2047,15 +2047,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetDisplayMode(IWineD3DDevice *iface, U
 
     ret = ChangeDisplaySettingsExW(NULL, &devmode, NULL, CDS_FULLSCREEN, NULL);
     if (ret != DISP_CHANGE_SUCCESSFUL) {
-        if(devmode.dmDisplayFrequency != 0) {
-            WARN("ChangeDisplaySettingsExW failed, trying without the refresh rate\n");
-            devmode.dmFields &= ~DM_DISPLAYFREQUENCY;
-            devmode.dmDisplayFrequency = 0;
-            ret = ChangeDisplaySettingsExW(NULL, &devmode, NULL, CDS_FULLSCREEN, NULL) != DISP_CHANGE_SUCCESSFUL;
-        }
-        if(ret != DISP_CHANGE_SUCCESSFUL) {
-            return WINED3DERR_NOTAVAILABLE;
-        }
+        return WINED3DERR_NOTAVAILABLE;
     }
 
     /* Store the new values */
-- 
1.4.4.2



More information about the wine-patches mailing list