[PATCH 1/3] gdi32/tests: Test GetDeviceCaps() for DCs on multiple monitor systems.
Zhiyi Zhang
zzhang at codeweavers.com
Wed Jan 20 02:39:48 CST 2021
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
dlls/gdi32/tests/dc.c | 220 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 220 insertions(+)
diff --git a/dlls/gdi32/tests/dc.c b/dlls/gdi32/tests/dc.c
index 04703288302..aa6917d432d 100644
--- a/dlls/gdi32/tests/dc.c
+++ b/dlls/gdi32/tests/dc.c
@@ -1672,6 +1672,225 @@ static void test_clip_box(void)
DeleteObject(bitmap);
}
+static void test_multi_monitor_dc(void)
+{
+ INT value, count, old_count;
+ DWORD device_idx, mode_idx;
+ DEVMODEA dm, dm2, dm3;
+ DISPLAY_DEVICEA dd;
+ BOOL ret;
+ LONG res;
+ HDC hdc;
+
+ /* Test DCs covering the entire virtual screen */
+ hdc = CreateDCA("DISPLAY", NULL, NULL, NULL);
+ ok(!!hdc, "CreateDCA failed.\n");
+
+ memset(&dm, 0, sizeof(dm));
+ dm.dmSize = sizeof(dm);
+ ret = EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &dm);
+ ok(ret, "EnumDisplaySettingsA failed.\n");
+
+ value = GetDeviceCaps(hdc, HORZRES);
+ ok(value == dm.dmPelsWidth, "Expected %d, got %d.\n", dm.dmPelsWidth, value);
+
+ value = GetDeviceCaps(hdc, VERTRES);
+ ok(value == dm.dmPelsHeight, "Expected %d, got %d.\n", dm.dmPelsHeight, value);
+
+ value = GetDeviceCaps(hdc, DESKTOPHORZRES);
+ todo_wine_if(dm.dmPelsWidth != GetSystemMetrics(SM_CXVIRTUALSCREEN)
+ && value == GetSystemMetrics(SM_CXVIRTUALSCREEN))
+ ok(value == dm.dmPelsWidth, "Expected %d, got %d.\n", dm.dmPelsWidth, value);
+
+ value = GetDeviceCaps(hdc, DESKTOPVERTRES);
+ todo_wine_if(dm.dmPelsHeight != GetSystemMetrics(SM_CYVIRTUALSCREEN)
+ && value == GetSystemMetrics(SM_CYVIRTUALSCREEN))
+ ok(value == dm.dmPelsHeight, "Expected %d, got %d.\n", dm.dmPelsHeight, value);
+
+ value = GetDeviceCaps(hdc, VREFRESH);
+ todo_wine_if(value != dm.dmDisplayFrequency && value == 1)
+ ok(value == dm.dmDisplayFrequency, "Expected %d, got %d.\n", dm.dmDisplayFrequency, value);
+
+ /* Test GetDeviceCaps() values after mode changes */
+ memset(&dm2, 0, sizeof(dm2));
+ dm2.dmSize = sizeof(dm2);
+ for (mode_idx = 0; EnumDisplaySettingsA(NULL, mode_idx, &dm2); ++mode_idx)
+ {
+ if (dm2.dmPelsWidth != dm.dmPelsWidth && dm2.dmPelsHeight != dm.dmPelsHeight)
+ break;
+ }
+ ok(dm2.dmPelsWidth && dm2.dmPelsWidth != dm.dmPelsWidth && dm2.dmPelsHeight != dm.dmPelsHeight,
+ "Failed to find a different resolution.\n");
+
+ res = ChangeDisplaySettingsExA(NULL, &dm2, NULL, CDS_RESET, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL || broken(res == DISP_CHANGE_FAILED), /* Win8 TestBots */
+ "ChangeDisplaySettingsExA returned unexpected %d.\n", res);
+ if (res == DISP_CHANGE_SUCCESSFUL)
+ {
+ value = GetDeviceCaps(hdc, HORZRES);
+ ok(value == dm2.dmPelsWidth, "Expected %d, got %d.\n", dm2.dmPelsWidth, value);
+
+ value = GetDeviceCaps(hdc, VERTRES);
+ ok(value == dm2.dmPelsHeight, "Expected %d, got %d.\n", dm2.dmPelsHeight, value);
+
+ value = GetDeviceCaps(hdc, DESKTOPHORZRES);
+ todo_wine_if(dm2.dmPelsWidth != GetSystemMetrics(SM_CXVIRTUALSCREEN)
+ && value == GetSystemMetrics(SM_CXVIRTUALSCREEN))
+ ok(value == dm2.dmPelsWidth, "Expected %d, got %d.\n", dm2.dmPelsWidth, value);
+
+ value = GetDeviceCaps(hdc, DESKTOPVERTRES);
+ todo_wine_if(dm2.dmPelsHeight != GetSystemMetrics(SM_CYVIRTUALSCREEN)
+ && value == GetSystemMetrics(SM_CYVIRTUALSCREEN))
+ ok(value == dm2.dmPelsHeight, "Expected %d, got %d.\n", dm2.dmPelsHeight, value);
+
+ value = GetDeviceCaps(hdc, VREFRESH);
+ todo_wine_if(value != dm2.dmDisplayFrequency && value == 1)
+ ok(value == dm2.dmDisplayFrequency, "Expected %d, got %d.\n", dm2.dmDisplayFrequency, value);
+
+ res = ChangeDisplaySettingsExA(NULL, NULL, NULL, 0, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA returned unexpected %d.\n", res);
+ }
+
+ DeleteDC(hdc);
+
+ /* Test DCs covering a specific monitor */
+ dd.cb = sizeof(dd);
+ for (device_idx = 0; EnumDisplayDevicesA(NULL, device_idx, &dd, 0); ++device_idx)
+ {
+ if (!(dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
+ continue;
+
+ memset(&dm, 0, sizeof(dm));
+ dm.dmSize = sizeof(dm);
+ ret = EnumDisplaySettingsA(dd.DeviceName, ENUM_CURRENT_SETTINGS, &dm);
+ ok(ret, "EnumDisplaySettingsA %s failed.\n", dd.DeviceName);
+
+ hdc = CreateDCA(dd.DeviceName, NULL, NULL, NULL);
+ ok(!!hdc, "CreateDCA %s failed.\n", dd.DeviceName);
+
+ value = GetDeviceCaps(hdc, HORZRES);
+ todo_wine_if(dm.dmPelsWidth != GetSystemMetrics(SM_CXSCREEN))
+ ok(value == dm.dmPelsWidth, "Expected %d, got %d.\n", dm.dmPelsWidth, value);
+
+ value = GetDeviceCaps(hdc, VERTRES);
+ todo_wine_if(dm.dmPelsHeight != GetSystemMetrics(SM_CYSCREEN))
+ ok(value == dm.dmPelsHeight, "Expected %d, got %d.\n", dm.dmPelsHeight, value);
+
+ value = GetDeviceCaps(hdc, DESKTOPHORZRES);
+ todo_wine_if(dm.dmPelsWidth != GetSystemMetrics(SM_CXVIRTUALSCREEN)
+ && value == GetSystemMetrics(SM_CXVIRTUALSCREEN))
+ ok(value == dm.dmPelsWidth, "Expected %d, got %d.\n", dm.dmPelsWidth, value);
+
+ value = GetDeviceCaps(hdc, DESKTOPVERTRES);
+ todo_wine_if(dm.dmPelsHeight != GetSystemMetrics(SM_CYVIRTUALSCREEN)
+ && value == GetSystemMetrics(SM_CYVIRTUALSCREEN))
+ ok(value == dm.dmPelsHeight, "Expected %d, got %d.\n", dm.dmPelsHeight, value);
+
+ value = GetDeviceCaps(hdc, VREFRESH);
+ todo_wine_if(value != dm.dmDisplayFrequency && value == 1)
+ ok(value == dm.dmDisplayFrequency, "Expected %d, got %d.\n", dm.dmDisplayFrequency, value);
+
+ /* Test GetDeviceCaps() values after mode changes */
+ memset(&dm2, 0, sizeof(dm2));
+ dm2.dmSize = sizeof(dm2);
+ for (mode_idx = 0; EnumDisplaySettingsA(dd.DeviceName, mode_idx, &dm2); ++mode_idx)
+ {
+ if (dm2.dmPelsWidth != dm.dmPelsWidth && dm2.dmPelsHeight != dm.dmPelsHeight)
+ break;
+ }
+ ok(dm2.dmPelsWidth && dm2.dmPelsWidth != dm.dmPelsWidth && dm2.dmPelsHeight != dm.dmPelsHeight,
+ "Failed to find a different resolution for %s.\n", dd.DeviceName);
+
+ res = ChangeDisplaySettingsExA(dd.DeviceName, &dm2, NULL, CDS_RESET, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL
+ || broken(res == DISP_CHANGE_FAILED), /* Win8 TestBots */
+ "ChangeDisplaySettingsExA %s returned unexpected %d.\n", dd.DeviceName, res);
+ if (res != DISP_CHANGE_SUCCESSFUL)
+ {
+ win_skip("Failed to change display mode for %s.\n", dd.DeviceName);
+ DeleteDC(hdc);
+ continue;
+ }
+
+ value = GetDeviceCaps(hdc, HORZRES);
+ todo_wine_if(dm2.dmPelsWidth != GetSystemMetrics(SM_CXSCREEN))
+ ok(value == dm2.dmPelsWidth, "Expected %d, got %d.\n", dm2.dmPelsWidth, value);
+
+ value = GetDeviceCaps(hdc, VERTRES);
+ todo_wine_if(dm2.dmPelsHeight != GetSystemMetrics(SM_CYSCREEN))
+ ok(value == dm2.dmPelsHeight, "Expected %d, got %d.\n", dm2.dmPelsHeight, value);
+
+ value = GetDeviceCaps(hdc, DESKTOPHORZRES);
+ todo_wine_if(dm2.dmPelsWidth != GetSystemMetrics(SM_CXVIRTUALSCREEN)
+ && value == GetSystemMetrics(SM_CXVIRTUALSCREEN))
+ ok(value == dm2.dmPelsWidth, "Expected %d, got %d.\n", dm2.dmPelsWidth, value);
+
+ value = GetDeviceCaps(hdc, DESKTOPVERTRES);
+ todo_wine_if(dm2.dmPelsHeight != GetSystemMetrics(SM_CYVIRTUALSCREEN)
+ && value == GetSystemMetrics(SM_CYVIRTUALSCREEN))
+ ok(value == dm2.dmPelsHeight, "Expected %d, got %d.\n", dm2.dmPelsHeight, value);
+
+ value = GetDeviceCaps(hdc, VREFRESH);
+ todo_wine_if(value != dm2.dmDisplayFrequency && value == 1)
+ ok(value == dm2.dmDisplayFrequency, "Expected %d, got %d.\n", dm2.dmDisplayFrequency, value);
+
+ /* Test GetDeviceCaps() values after monitor detach */
+ if (!(dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE))
+ {
+ old_count = GetSystemMetrics(SM_CMONITORS);
+
+ memset(&dm3, 0, sizeof(dm3));
+ dm3.dmSize = sizeof(dm3);
+ ret = EnumDisplaySettingsA(dd.DeviceName, ENUM_CURRENT_SETTINGS, &dm3);
+ ok(ret, "EnumDisplaySettingsA %s failed.\n", dd.DeviceName);
+
+ dm3.dmFields = DM_POSITION | DM_PELSWIDTH | DM_PELSHEIGHT;
+ dm3.dmPelsWidth = 0;
+ dm3.dmPelsHeight = 0;
+ res = ChangeDisplaySettingsExA(dd.DeviceName, &dm3, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned unexpected %d.\n",
+ dd.DeviceName, res);
+ res = ChangeDisplaySettingsExA(dd.DeviceName, NULL, NULL, 0, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned unexpected %d.\n",
+ dd.DeviceName, res);
+
+ count = GetSystemMetrics(SM_CMONITORS);
+ ok(count == old_count - 1, "Expected monitor count %d, got %d.\n", old_count - 1, count);
+
+ /* Should report the same values before detach */
+ value = GetDeviceCaps(hdc, HORZRES);
+ todo_wine_if(dm2.dmPelsWidth != GetSystemMetrics(SM_CXSCREEN))
+ ok(value == dm2.dmPelsWidth, "Expected %d, got %d.\n", dm2.dmPelsWidth, value);
+
+ value = GetDeviceCaps(hdc, VERTRES);
+ todo_wine_if(dm2.dmPelsHeight != GetSystemMetrics(SM_CYSCREEN))
+ ok(value == dm2.dmPelsHeight, "Expected %d, got %d.\n", dm2.dmPelsHeight, value);
+
+ value = GetDeviceCaps(hdc, DESKTOPHORZRES);
+ todo_wine_if(dm2.dmPelsWidth != GetSystemMetrics(SM_CXVIRTUALSCREEN)
+ && value == GetSystemMetrics(SM_CXVIRTUALSCREEN))
+ ok(value == dm2.dmPelsWidth, "Expected %d, got %d.\n", dm2.dmPelsWidth, value);
+
+ value = GetDeviceCaps(hdc, DESKTOPVERTRES);
+ todo_wine_if(dm2.dmPelsHeight != GetSystemMetrics(SM_CYVIRTUALSCREEN)
+ && value == GetSystemMetrics(SM_CYVIRTUALSCREEN))
+ ok(value == dm2.dmPelsHeight, "Expected %d, got %d.\n", dm2.dmPelsHeight, value);
+
+ value = GetDeviceCaps(hdc, VREFRESH);
+ todo_wine_if(value != dm2.dmDisplayFrequency && value == 1)
+ ok(value == dm2.dmDisplayFrequency, "Expected %d, got %d.\n", dm2.dmDisplayFrequency, value);
+ }
+
+ res = ChangeDisplaySettingsExA(dd.DeviceName, &dm, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned unexpected %d.\n",
+ dd.DeviceName, res);
+ res = ChangeDisplaySettingsExA(NULL, NULL, NULL, 0, NULL);
+ ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned unexpected %d.\n",
+ dd.DeviceName, res);
+ DeleteDC(hdc);
+ }
+}
+
START_TEST(dc)
{
test_dc_values();
@@ -1688,4 +1907,5 @@ START_TEST(dc)
test_printer_dc();
test_pscript_printer_dc();
test_clip_box();
+ test_multi_monitor_dc();
}
--
2.27.0
More information about the wine-devel
mailing list