From: R��mi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 452f1c706b0..3fe41ecf145 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -506,7 +506,7 @@ static BOOL read_adapter_mode( HKEY adapter_key, DWORD index, DEVMODEW *mode ) return TRUE; }
-static BOOL read_registry_settings( const WCHAR *adapter_path, DEVMODEW *mode ) +static BOOL read_registry_settings( const WCHAR *adapter_path, DWORD index, DEVMODEW *mode ) { BOOL ret = FALSE; HANDLE mutex; @@ -518,7 +518,7 @@ static BOOL read_registry_settings( const WCHAR *adapter_path, DEVMODEW *mode ) else if (!(hkey = reg_open_key( config_key, adapter_path, lstrlenW( adapter_path ) * sizeof(WCHAR) ))) ret = FALSE; else { - ret = read_adapter_mode( hkey, ENUM_REGISTRY_SETTINGS, mode ); + ret = read_adapter_mode( hkey, index, mode ); NtClose( hkey ); }
@@ -2186,7 +2186,7 @@ static DEVMODEW *get_full_mode( const WCHAR *adapter_path, const WCHAR *device_n if (devmode) memcpy( temp_mode, devmode, devmode->dmSize ); else { - if (!read_registry_settings( adapter_path, temp_mode )) return NULL; + if (!read_registry_settings( adapter_path, ENUM_REGISTRY_SETTINGS, temp_mode )) return NULL; TRACE( "Return to original display mode\n" ); } devmode = temp_mode; @@ -2200,7 +2200,9 @@ static DEVMODEW *get_full_mode( const WCHAR *adapter_path, const WCHAR *device_n if (!is_detached_mode( devmode ) && (!devmode->dmPelsWidth || !devmode->dmPelsHeight || !(devmode->dmFields & DM_POSITION))) { DEVMODEW current_mode = {.dmSize = sizeof(DEVMODEW)}; - if (!user_driver->pGetCurrentDisplaySettings( device_name, ¤t_mode )) return NULL; + if (!user_driver->pGetCurrentDisplaySettings( device_name, ¤t_mode ) && + !read_registry_settings( adapter_path, ENUM_CURRENT_SETTINGS, ¤t_mode )) + return NULL; if (!devmode->dmPelsWidth) devmode->dmPelsWidth = current_mode.dmPelsWidth; if (!devmode->dmPelsHeight) devmode->dmPelsHeight = current_mode.dmPelsHeight; if (!(devmode->dmFields & DM_POSITION)) @@ -2236,8 +2238,12 @@ static DEVMODEW *get_display_settings( const WCHAR *devname, const DEVMODEW *dev memcpy( &mode->dmFields, &devmode->dmFields, devmode->dmSize - offsetof(DEVMODEW, dmFields) ); else { - if (!devname) ret = read_registry_settings( adapter->config_key, mode ); - else ret = user_driver->pGetCurrentDisplaySettings( adapter->dev.device_name, mode ); + if (!devname) ret = read_registry_settings( adapter->config_key, ENUM_REGISTRY_SETTINGS, mode ); + else + { + ret = user_driver->pGetCurrentDisplaySettings( adapter->dev.device_name, mode ); + if (!ret) ret = read_registry_settings( adapter->config_key, ENUM_CURRENT_SETTINGS, mode ); + } if (!ret) goto done; }
@@ -2563,10 +2569,14 @@ BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD index, DEVM devmode->dmSize = offsetof(DEVMODEW, dmICMMethod); memset( &devmode->dmDriverExtra, 0, devmode->dmSize - offsetof(DEVMODEW, dmDriverExtra) );
- if (index == ENUM_REGISTRY_SETTINGS) ret = read_registry_settings( adapter_path, devmode ); + if (index == ENUM_REGISTRY_SETTINGS) ret = read_registry_settings( adapter_path, ENUM_REGISTRY_SETTINGS, devmode ); /* if EDS_ROTATEDMODE is not specified, enumerate modes with the same display orientation as current */ else if (index != ENUM_CURRENT_SETTINGS && (flags & EDS_ROTATEDMODE)) ret = TRUE; - else ret = user_driver->pGetCurrentDisplaySettings( device_name, devmode ); + else + { + ret = user_driver->pGetCurrentDisplaySettings( device_name, devmode ); + if (!ret) ret = read_registry_settings( adapter_path, ENUM_CURRENT_SETTINGS, devmode ); + }
if (ret && index != ENUM_REGISTRY_SETTINGS && index != ENUM_CURRENT_SETTINGS) {