From: R��mi Bernon rbernon@codeweavers.com
And make dmDisplayFixedOutput / DM_DISPLAYFIXEDOUTPUT optional. --- dlls/win32u/sysparams.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index edf094cd1e7..94c827304c3 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -433,12 +433,20 @@ static BOOL write_adapter_mode( HKEY adapter_key, DWORD index, const DEVMODEW *m BOOL ret;
sprintf( buffer, "Modes\%08X", index ); + reg_delete_tree( adapter_key, bufferW, asciiz_to_unicode( bufferW, buffer ) - sizeof(WCHAR) ); if (!(hkey = reg_create_key( adapter_key, bufferW, asciiz_to_unicode( bufferW, buffer ) - sizeof(WCHAR), REG_OPTION_VOLATILE, NULL ))) return FALSE;
-#define set_mode_field( name, field, flag ) \ - if (!(ret = set_reg_value( hkey, (name), REG_DWORD, &mode->field, sizeof(mode->field) ))) goto done; + +#define set_mode_field( name, field, flag ) \ + do \ + { \ + if (!(mode->dmFields & (flag))) ret = (index == ENUM_REGISTRY_SETTINGS); \ + else ret = set_reg_value( hkey, (name), REG_DWORD, &mode->field, \ + sizeof(mode->field) ); \ + if (!ret) goto done; \ + } while (0)
set_mode_field( bits_per_pelW, dmBitsPerPel, DM_BITSPERPEL ); set_mode_field( x_resolutionW, dmPelsWidth, DM_PELSWIDTH ); @@ -446,7 +454,7 @@ static BOOL write_adapter_mode( HKEY adapter_key, DWORD index, const DEVMODEW *m set_mode_field( v_refreshW, dmDisplayFrequency, DM_DISPLAYFREQUENCY ); set_mode_field( flagsW, dmDisplayFlags, DM_DISPLAYFLAGS ); set_mode_field( orientationW, dmDisplayOrientation, DM_DISPLAYORIENTATION ); - set_mode_field( fixed_outputW, dmDisplayFixedOutput, DM_DISPLAYFIXEDOUTPUT ); + if (mode->dmFields & DM_DISPLAYFIXEDOUTPUT) set_mode_field( fixed_outputW, dmDisplayFixedOutput, DM_DISPLAYFIXEDOUTPUT ); if (index == ENUM_CURRENT_SETTINGS || index == ENUM_REGISTRY_SETTINGS) { set_mode_field( x_panningW, dmPosition.x, DM_POSITION ); @@ -467,7 +475,6 @@ static BOOL read_adapter_mode( HKEY adapter_key, DWORD index, DEVMODEW *mode ) WCHAR bufferW[MAX_PATH]; char buffer[MAX_PATH]; HKEY hkey; - BOOL ret;
sprintf( buffer, "Modes\%08X", index ); if (!(hkey = reg_open_key( adapter_key, bufferW, asciiz_to_unicode( bufferW, buffer ) - sizeof(WCHAR) ))) @@ -476,11 +483,12 @@ static BOOL read_adapter_mode( HKEY adapter_key, DWORD index, DEVMODEW *mode ) #define query_mode_field( name, field, flag ) \ do \ { \ - ret = query_reg_value( hkey, (name), value, sizeof(value_buf) ) && \ - value->Type == REG_DWORD; \ - if (!ret) goto done; \ - mode->field = *(const DWORD *)value->Data; \ - mode->dmFields |= (flag); \ + if (query_reg_value( hkey, (name), value, sizeof(value_buf) ) && \ + value->Type == REG_DWORD) \ + { \ + mode->field = *(const DWORD *)value->Data; \ + mode->dmFields |= (flag); \ + } \ } while (0)
query_mode_field( bits_per_pelW, dmBitsPerPel, DM_BITSPERPEL ); @@ -488,17 +496,16 @@ static BOOL read_adapter_mode( HKEY adapter_key, DWORD index, DEVMODEW *mode ) query_mode_field( y_resolutionW, dmPelsHeight, DM_PELSHEIGHT ); query_mode_field( v_refreshW, dmDisplayFrequency, DM_DISPLAYFREQUENCY ); query_mode_field( flagsW, dmDisplayFlags, DM_DISPLAYFLAGS ); + query_mode_field( orientationW, dmDisplayOrientation, DM_DISPLAYORIENTATION ); + query_mode_field( fixed_outputW, dmDisplayFixedOutput, DM_DISPLAYFIXEDOUTPUT ); if (index == ENUM_CURRENT_SETTINGS || index == ENUM_REGISTRY_SETTINGS) { query_mode_field( x_panningW, dmPosition.x, DM_POSITION ); query_mode_field( y_panningW, dmPosition.y, DM_POSITION ); } - query_mode_field( orientationW, dmDisplayOrientation, DM_DISPLAYORIENTATION ); - query_mode_field( fixed_outputW, dmDisplayFixedOutput, 0 );
#undef query_mode_field
-done: NtClose( hkey ); return TRUE; }