Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/user32/tests/monitor.c | 102 ++++++++++++++++++++++++++++++------
1 file changed, 87 insertions(+), 15 deletions(-)
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index b151721533d..7cd41145ea1 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -298,34 +298,38 @@ static void _expect_dm(INT line, DEVMODEA expected, const CHAR *device, DWORD te
ok_(__FILE__, line)((dm.dmFields & expected.dmFields) == expected.dmFields,
"Device %s test %d expect dmFields to contain %#x, got %#x\n", device, test, expected.dmFields, dm.dmFields);
/* Wine doesn't support changing color depth yet */
- todo_wine_if(expected.dmBitsPerPel != 32 && expected.dmBitsPerPel != 24)
- ok_(__FILE__, line)(dm.dmBitsPerPel == expected.dmBitsPerPel, "Device %s test %d expect dmBitsPerPel %d, got %d\n",
- device, test, expected.dmBitsPerPel, dm.dmBitsPerPel);
- ok_(__FILE__, line)(dm.dmPelsWidth == expected.dmPelsWidth, "Device %s test %d expect dmPelsWidth %d, got %d\n",
- device, test, expected.dmPelsWidth, dm.dmPelsWidth);
- ok_(__FILE__, line)(dm.dmPelsHeight == expected.dmPelsHeight, "Device %s test %d expect dmPelsHeight %d, got %d\n",
- device, test, expected.dmPelsHeight, dm.dmPelsHeight);
- ok_(__FILE__, line)(dm.dmPosition.x == expected.dmPosition.x, "Device %s test %d expect dmPosition.x %d, got %d\n",
- device, test, expected.dmPosition.x, dm.dmPosition.x);
- ok_(__FILE__, line)(dm.dmPosition.y == expected.dmPosition.y, "Device %s test %d expect dmPosition.y %d, got %d\n",
- device, test, expected.dmPosition.y, dm.dmPosition.y);
- ok_(__FILE__, line)(dm.dmDisplayFrequency == expected.dmDisplayFrequency,
- "Device %s test %d expect dmDisplayFrequency %d, got %d\n", device, test, expected.dmDisplayFrequency,
+ todo_wine_if(expected.dmFields & DM_BITSPERPEL && expected.dmBitsPerPel != 32 && expected.dmBitsPerPel != 24)
+ ok_(__FILE__, line)(!(expected.dmFields & DM_BITSPERPEL) || dm.dmBitsPerPel == expected.dmBitsPerPel,
+ "Device %s test %d expect dmBitsPerPel %u, got %u\n", device, test, expected.dmBitsPerPel, dm.dmBitsPerPel);
+ ok_(__FILE__, line)(!(expected.dmFields & DM_PELSWIDTH) || dm.dmPelsWidth == expected.dmPelsWidth,
+ "Device %s test %d expect dmPelsWidth %u, got %u\n", device, test, expected.dmPelsWidth, dm.dmPelsWidth);
+ ok_(__FILE__, line)(!(expected.dmFields & DM_PELSHEIGHT) || dm.dmPelsHeight == expected.dmPelsHeight,
+ "Device %s test %d expect dmPelsHeight %u, got %u\n", device, test, expected.dmPelsHeight, dm.dmPelsHeight);
+ ok_(__FILE__, line)(!(expected.dmFields & DM_POSITION) || dm.dmPosition.x == expected.dmPosition.x,
+ "Device %s test %d expect dmPosition.x %d, got %d\n", device, test, expected.dmPosition.x, dm.dmPosition.x);
+ ok_(__FILE__, line)(!(expected.dmFields & DM_POSITION) || dm.dmPosition.y == expected.dmPosition.y,
+ "Device %s test %d expect dmPosition.y %d, got %d\n", device, test, expected.dmPosition.y, dm.dmPosition.y);
+ ok_(__FILE__, line)(!(expected.dmFields & DM_DISPLAYFREQUENCY) ||
+ dm.dmDisplayFrequency == expected.dmDisplayFrequency,
+ "Device %s test %d expect dmDisplayFrequency %u, got %u\n", device, test, expected.dmDisplayFrequency,
dm.dmDisplayFrequency);
- ok_(__FILE__, line)(dm.dmDisplayOrientation == expected.dmDisplayOrientation,
+ ok_(__FILE__, line)(!(expected.dmFields & DM_DISPLAYORIENTATION) ||
+ dm.dmDisplayOrientation == expected.dmDisplayOrientation,
"Device %s test %d expect dmDisplayOrientation %d, got %d\n", device, test, expected.dmDisplayOrientation,
dm.dmDisplayOrientation);
}
static void test_ChangeDisplaySettingsEx(void)
{
+ static const DWORD registry_fields = DM_DISPLAYORIENTATION | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT |
+ DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY | DM_POSITION;
DPI_AWARENESS_CONTEXT context = NULL;
UINT primary, device, test, mode;
UINT device_size, device_count;
struct device_info *devices;
+ DEVMODEA dm, dm2, dm3;
INT count, old_count;
DISPLAY_DEVICEA dd;
- DEVMODEA dm, dm2;
POINTL position;
DEVMODEW dmW;
LONG res;
@@ -672,10 +676,26 @@ static void test_ChangeDisplaySettingsEx(void)
/* Test changing modes by saving settings to the registry first */
for (device = 0; device < device_count; ++device)
{
+ /* Place adapter to the right */
+ if (device == 0)
+ {
+ position.x = 0;
+ position.y = 0;
+ }
+ else
+ {
+ memset(&dm, 0, sizeof(dm));
+ dm.dmSize = sizeof(dm);
+ res = EnumDisplaySettingsA(devices[device - 1].name, ENUM_CURRENT_SETTINGS, &dm);
+ ok(res, "EnumDisplaySettingsA %s failed, error %#x.\n", devices[device - 1].name, GetLastError());
+ position.x = dm.dmPosition.x + dm.dmPelsWidth;
+ }
+
memset(&dm, 0, sizeof(dm));
dm.dmSize = sizeof(dm);
res = EnumDisplaySettingsA(devices[device].name, ENUM_CURRENT_SETTINGS, &dm);
ok(res, "EnumDisplaySettingsA %s failed, error %#x\n", devices[device].name, GetLastError());
+ dm3 = dm;
/* Find a mode that's different from the current mode */
memset(&dm2, 0, sizeof(dm2));
@@ -687,6 +707,8 @@ static void test_ChangeDisplaySettingsEx(void)
}
ok(dm2.dmPelsWidth != dm.dmPelsWidth && dm2.dmPelsHeight != dm.dmPelsHeight, "Failed to find a different mode.\n");
+ /* Test normal operation */
+ dm.dmPosition = position;
dm.dmPelsWidth = dm2.dmPelsWidth;
dm.dmPelsHeight = dm2.dmPelsHeight;
dm.dmDisplayFrequency = dm2.dmDisplayFrequency;
@@ -706,6 +728,56 @@ static void test_ChangeDisplaySettingsEx(void)
flush_events();
expect_dm(dm, devices[device].name, 0);
+
+ /* Test specifying only position, width and height */
+ memset(&dm, 0, sizeof(dm));
+ dm.dmSize = sizeof(dm);
+ dm.dmFields = DM_POSITION | DM_PELSWIDTH | DM_PELSHEIGHT;
+ dm.dmPosition = position;
+ dm.dmPelsWidth = dm3.dmPelsWidth;
+ dm.dmPelsHeight = dm3.dmPelsHeight;
+ res = ChangeDisplaySettingsExA(devices[device].name, &dm, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned %d.\n", devices[device].name, res);
+ res = EnumDisplaySettingsA(devices[device].name, ENUM_REGISTRY_SETTINGS, &dm);
+ /* Win10 either returns failure here or retrieves outdated display settings until they're applied */
+ if (res)
+ {
+ ok((dm.dmFields & registry_fields) == registry_fields, "Got unexpected dmFields %#x.\n", dm.dmFields);
+ ok(dm.dmPosition.x == position.x, "Expected dmPosition.x %d, got %d.\n", position.x, dm.dmPosition.x);
+ ok(dm.dmPosition.y == position.y, "Expected dmPosition.y %d, got %d.\n", position.y, dm.dmPosition.y);
+ ok(dm.dmPelsWidth == dm3.dmPelsWidth || broken(dm.dmPelsWidth == dm2.dmPelsWidth), /* Win10 */
+ "Expected dmPelsWidth %u, got %u.\n", dm3.dmPelsWidth, dm.dmPelsWidth);
+ ok(dm.dmPelsHeight == dm3.dmPelsHeight || broken(dm.dmPelsHeight == dm2.dmPelsHeight), /* Win10 */
+ "Expected dmPelsHeight %u, got %u.\n", dm3.dmPelsHeight, dm.dmPelsHeight);
+ todo_wine ok(dm.dmBitsPerPel, "Expected dmBitsPerPel not zero.\n");
+ todo_wine ok(dm.dmDisplayFrequency, "Expected dmDisplayFrequency not zero.\n");
+ }
+ else
+ {
+ win_skip("EnumDisplaySettingsA %s failed, error %#x.\n", devices[device].name, GetLastError());
+ }
+
+ res = ChangeDisplaySettingsExA(devices[device].name, NULL, NULL, 0, NULL);
+ todo_wine ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned %d.\n", devices[device].name, res);
+ if (res != DISP_CHANGE_SUCCESSFUL)
+ {
+ skip("ChangeDisplaySettingsExA %s returned %d.\n", devices[device].name, res);
+ continue;
+ }
+ flush_events();
+
+ res = EnumDisplaySettingsA(devices[device].name, ENUM_REGISTRY_SETTINGS, &dm);
+ ok(res, "EnumDisplaySettingsA %s failed, error %#x.\n", devices[device].name, GetLastError());
+ ok((dm.dmFields & registry_fields) == registry_fields, "Got unexpected dmFields %#x.\n", dm.dmFields);
+ ok(dm.dmPosition.x == position.x, "Expected dmPosition.x %d, got %d.\n", position.x, dm.dmPosition.x);
+ ok(dm.dmPosition.y == position.y, "Expected dmPosition.y %d, got %d.\n", position.y, dm.dmPosition.y);
+ ok(dm.dmPelsWidth == dm3.dmPelsWidth, "Expected dmPelsWidth %u, got %u.\n", dm3.dmPelsWidth, dm.dmPelsWidth);
+ ok(dm.dmPelsHeight == dm3.dmPelsHeight, "Expected dmPelsHeight %u, got %u.\n", dm3.dmPelsHeight,
+ dm.dmPelsHeight);
+ ok(dm.dmBitsPerPel, "Expected dmBitsPerPel not zero.\n");
+ ok(dm.dmDisplayFrequency, "Expected dmDisplayFrequency not zero.\n");
+
+ expect_dm(dm, devices[device].name, 0);
}
/* Test dmPosition */
--
2.25.1