Dmitry Timoshkov : user32: Make ChangeDisplaySettingsA/ W reset dmDriverExtra to 0 like XP and Vista do.
Alexandre Julliard
julliard at winehq.org
Mon May 19 09:39:38 CDT 2008
Module: wine
Branch: master
Commit: 47b496012938917f7bb37feb7e971a442456feda
URL: http://source.winehq.org/git/wine.git/?a=commit;h=47b496012938917f7bb37feb7e971a442456feda
Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date: Sun May 18 18:47:14 2008 +0900
user32: Make ChangeDisplaySettingsA/W reset dmDriverExtra to 0 like XP and Vista do.
---
dlls/user32/sysparams.c | 4 +++
dlls/user32/tests/monitor.c | 53 ++++++++++++++++++++++++++++++++++++++-----
2 files changed, 51 insertions(+), 6 deletions(-)
diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index 71e846d..b2fe627 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -2975,6 +2975,8 @@ HPEN SYSCOLOR_GetPen( INT index )
*/
LONG WINAPI ChangeDisplaySettingsA( LPDEVMODEA devmode, DWORD flags )
{
+ if (devmode) devmode->dmDriverExtra = 0;
+
return ChangeDisplaySettingsExA(NULL,devmode,NULL,flags,NULL);
}
@@ -2984,6 +2986,8 @@ LONG WINAPI ChangeDisplaySettingsA( LPDEVMODEA devmode, DWORD flags )
*/
LONG WINAPI ChangeDisplaySettingsW( LPDEVMODEW devmode, DWORD flags )
{
+ if (devmode) devmode->dmDriverExtra = 0;
+
return ChangeDisplaySettingsExW(NULL,devmode,NULL,flags,NULL);
}
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index a723dd1..0de9bff 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -131,7 +131,9 @@ static const struct vid_mode vid_modes_test[] = {
{ 0, 480, 0, 0, DM_PELSWIDTH | DM_PELSHEIGHT, 0},
{640, 0, 0, 0, DM_PELSWIDTH | DM_PELSHEIGHT, 0},
- {0, 0, 0, 0, DM_DISPLAYFREQUENCY, 0},
+ /* the following test succeeds under XP SP3
+ {0, 0, 0, 0, DM_DISPLAYFREQUENCY, 0}
+ */
};
#define vid_modes_cnt (sizeof(vid_modes_test) / sizeof(vid_modes_test[0]))
@@ -155,6 +157,44 @@ static void test_ChangeDisplaySettingsEx(void)
width = dm.dmPelsWidth;
+ dm.dmDriverExtra = 1;
+ res = ChangeDisplaySettingsA(&dm, CDS_TEST);
+ ok(res == DISP_CHANGE_SUCCESSFUL,
+ "ChangeDisplaySettingsA returned %d, expected DISP_CHANGE_SUCCESSFUL\n", res);
+ ok(dm.dmDriverExtra == 0, "ChangeDisplaySettingsA didn't reset dmDriverExtra to 0\n");
+
+ /* crashes under XP SP3 for large dmDriverExtra values */
+ dm.dmDriverExtra = 1;
+ res = pChangeDisplaySettingsExA(NULL, &dm, NULL, CDS_TEST, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL,
+ "ChangeDisplaySettingsExW returned %d, expected DISP_CHANGE_BADMODE\n", res);
+ ok(dm.dmDriverExtra == 1, "ChangeDisplaySettingsExA shouldn't reset dmDriverExtra to 0\n");
+
+ memset(&dmW, 0, sizeof(dmW));
+ dmW.dmSize = sizeof(dmW);
+ dmW.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
+ dmW.dmPelsWidth = dm.dmPelsWidth;
+ dmW.dmPelsHeight = dm.dmPelsHeight;
+ dmW.dmDriverExtra = 1;
+ SetLastError(0xdeadbeef);
+ res = ChangeDisplaySettingsW(&dmW, CDS_TEST);
+ if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
+ {
+ ok(res == DISP_CHANGE_SUCCESSFUL,
+ "ChangeDisplaySettingsW returned %d, expected DISP_CHANGE_SUCCESSFUL\n", res);
+ ok(dmW.dmDriverExtra == 0, "ChangeDisplaySettingsW didn't reset dmDriverExtra to 0\n");
+ }
+
+ /* Apparently XP treats dmDriverExtra being != 0 as an error */
+ dmW.dmDriverExtra = 1;
+ res = pChangeDisplaySettingsExW(NULL, &dmW, NULL, CDS_TEST, NULL);
+ if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
+ {
+ ok(res == DISP_CHANGE_SUCCESSFUL,
+ "ChangeDisplaySettingsExW returned %d, expected DISP_CHANGE_BADMODE\n", res);
+ ok(dmW.dmDriverExtra == 1, "ChangeDisplaySettingsExW shouldn't reset dmDriverExtra to 0\n");
+ }
+
/* the following 2 tests show that dm.dmSize being 0 is invalid, but
* ChangeDisplaySettingsExA still reports success.
*/
@@ -171,8 +211,9 @@ static void test_ChangeDisplaySettingsEx(void)
SetLastError(0xdeadbeef);
res = pChangeDisplaySettingsExW(NULL, &dmW, NULL, CDS_TEST, NULL);
if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
- ok(res == DISP_CHANGE_FAILED,
- "ChangeDisplaySettingsExW returned %d, expected DISP_CHANGE_FAILED\n", res);
+ ok(res == DISP_CHANGE_FAILED ||
+ res == DISP_CHANGE_BADMODE /* XP SP3 */,
+ "ChangeDisplaySettingsExW returned %d, expected DISP_CHANGE_FAILED or DISP_CHANGE_BADMODE\n", res);
memset(&dm, 0, sizeof(dm));
dm.dmSize = sizeof(dm);
@@ -184,7 +225,7 @@ static void test_ChangeDisplaySettingsEx(void)
dm.dmBitsPerPel = vid_modes_test[i].bpp;
dm.dmDisplayFrequency = vid_modes_test[i].freq;
dm.dmFields = vid_modes_test[i].fields;
- res = pChangeDisplaySettingsExA(NULL, &dm, NULL, CDS_FULLSCREEN, NULL);
+ res = pChangeDisplaySettingsExA(NULL, &dm, NULL, CDS_TEST, NULL);
ok(vid_modes_test[i].success ?
(res == DISP_CHANGE_SUCCESSFUL) :
(res == DISP_CHANGE_BADMODE || res == DISP_CHANGE_BADPARAM),
@@ -243,8 +284,8 @@ START_TEST(monitor)
{
init_function_pointers();
test_enumdisplaydevices();
- if (winetest_interactive)
- test_ChangeDisplaySettingsEx();
+ test_ChangeDisplaySettingsEx();
+
if (pMonitorFromPoint && pMonitorFromWindow)
test_monitors();
else
More information about the wine-cvs
mailing list