From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/user32/tests/monitor.c | 40 ++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c index eaf3d268469..d781bcde815 100644 --- a/dlls/user32/tests/monitor.c +++ b/dlls/user32/tests/monitor.c @@ -38,6 +38,8 @@ #include <stdio.h> #include <math.h> +#define HIMETRIC_PER_INCH 2540 + DEFINE_DEVPROPKEY(DEVPROPKEY_MONITOR_GPU_LUID, 0xca085853, 0x16ce, 0x48aa, 0xb1, 0x14, 0xde, 0x9c, 0x72, 0x33, 0x42, 0x23, 1); DEFINE_DEVPROPKEY(DEVPROPKEY_MONITOR_OUTPUT_ID, 0xca085853, 0x16ce, 0x48aa, 0xb1, 0x14, 0xde, 0x9c, 0x72, 0x33, 0x42, 0x23, 2); @@ -3217,7 +3219,7 @@ static void test_monitor_dpi_awareness( const struct monitor_info *infos, UINT c DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED, (DPI_AWARENESS_CONTEXT)0x7811, }; - RECT virtual = {0}, scaled_virtual = {0}, monitor = {0}, scaled = {0}, primary = {0}, rect, expect_rect; + RECT virtual = {0}, scaled_virtual = {0}, monitor = {0}, scaled = {0}, primary = {0}, rect, expect_rect, device, scaled_device, expect_device; struct monitor_info tmp_info = {.handle = info->handle}; UINT ret, i, x, y, expect_width, expect_height; HWND unaware_hwnd, aware_hwnd, primary_hwnd; @@ -3279,6 +3281,18 @@ static void test_monitor_dpi_awareness( const struct monitor_info *infos, UINT c check_logical_physical_dpi( unaware_hwnd, monitor.left + 2 * scale + 1, monitor.top + 2 * scale + 1, monitor.left + 2 * scale + 1, monitor.top + 2 * scale + 1, FALSE ); + todo_wine ret = GetPointerDeviceRects( INVALID_HANDLE_VALUE, &device, &rect ); + todo_wine ok( ret, "GetPointerDeviceRects failed, error %lu.\n", GetLastError() ); + todo_wine ok( EqualRect( &rect, &scaled_virtual ), "got %s\n", wine_dbgstr_rect(&rect) ); + + SetRect( &expect_device, 0, 0, virtual.right * HIMETRIC_PER_INCH / system_dpi, + virtual.bottom * HIMETRIC_PER_INCH / system_dpi ); + scaled_device = expect_device; + scaled_device.right = MulDiv( scaled_device.right, 100, scale ); + scaled_device.bottom = MulDiv( scaled_device.bottom, 100, scale ); + todo_wine ok( EqualRect( &device, &expect_device ) /* w10 */ || EqualRect( &device, &scaled_device ) /* w11 */, + "got %s vs %s\n", wine_dbgstr_rect(&device), wine_dbgstr_rect(&expect_device) ); + for (i = 0; i < ARRAY_SIZE(tests); i++) { BOOL monitor_aware = tests[i] == DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE || @@ -3565,6 +3579,12 @@ static void test_monitor_dpi_awareness( const struct monitor_info *infos, UINT c check_logical_physical_dpi( primary_hwnd, primary.left + 4 * scale + 1, primary.top + 4 * scale + 1, primary.left + 4 * scale + 1, primary.top + 4 * scale + 1, FALSE ); + ret = GetPointerDeviceRects( INVALID_HANDLE_VALUE, &device, &rect ); + todo_wine ok( ret, "GetPointerDeviceRects failed, error %lu.\n", GetLastError() ); + todo_wine ok( EqualRect( &rect, monitor_aware ? &virtual : &scaled_virtual ), "got %s\n", wine_dbgstr_rect(&rect) ); + todo_wine ok( EqualRect( &device, &expect_device ) /* w10 */ || EqualRect( &device, &scaled_device ) /* w11 */, + "got %s vs %s\n", wine_dbgstr_rect(&device), wine_dbgstr_rect(&expect_device) ); + DestroyWindow( primary_hwnd ); DestroyWindow( aware_hwnd ); @@ -3630,6 +3650,7 @@ static void test_monitor_dpi(void) {1024, 768}, }; UINT i, j, count, system_dpi, dpi_x, dpi_y; + RECT expect_rect, device, display; DPI_AWARENESS_CONTEXT old_ctx; float scale_x, scale_y; BOOL ret, is_virtual; @@ -3660,11 +3681,14 @@ static void test_monitor_dpi(void) { for (j = 0; j < ARRAY_SIZE(tests); j++) { + RECT virtual = {0}; + if (tests[j].width && tests[j].height && !set_display_settings( infos[i].handle, tests[j].width, tests[j].height )) continue; get_monitor_infos( infos ); /* refresh infos as changing display settings may invalidate HMONITOR */ scale_x = (infos[i].rect.right - infos[i].rect.left) / (float)(phys_infos[i].rect.right - phys_infos[i].rect.left); scale_y = (infos[i].rect.bottom - infos[i].rect.top) / (float)(phys_infos[i].rect.bottom - phys_infos[i].rect.top); + for (UINT i = 0; i < count; i++) UnionRect( &virtual, &virtual, &infos[i].rect ); ret = pGetDpiForMonitorInternal( infos[i].handle, MDT_EFFECTIVE_DPI, &dpi_x, &dpi_y ); ok( ret, "GetDpiForMonitorInternal failed, error %lu\n", GetLastError() ); @@ -3704,6 +3728,13 @@ static void test_monitor_dpi(void) ok( fabs( dpi_y - system_dpi * scale_y ) < system_dpi * 0.05, "got MDT_RAW_DPI y %u\n", dpi_y ); } + ret = GetPointerDeviceRects( INVALID_HANDLE_VALUE, &device, &display ); + todo_wine ok( ret, "GetPointerDeviceRects failed, error %lu.\n", GetLastError() ); + todo_wine ok( EqualRect( &display, &virtual ), "got %s\n", wine_dbgstr_rect( &display ) ); + SetRect( &expect_rect, 0, 0, virtual.right * HIMETRIC_PER_INCH / system_dpi, + virtual.bottom * HIMETRIC_PER_INCH / system_dpi ); + todo_wine ok( EqualRect( &device, &expect_rect ), "got %s\n", wine_dbgstr_rect( &device ) ); + pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ); ret = pGetDpiForMonitorInternal( infos[i].handle, MDT_EFFECTIVE_DPI, &dpi_x, &dpi_y ); @@ -3744,6 +3775,13 @@ static void test_monitor_dpi(void) ok( fabs( dpi_y - system_dpi * scale_y ) < system_dpi * 0.05, "got MDT_RAW_DPI y %u\n", dpi_y ); } + ret = GetPointerDeviceRects( INVALID_HANDLE_VALUE, &device, &display ); + todo_wine ok( ret, "GetPointerDeviceRects failed, error %lu.\n", GetLastError() ); + todo_wine ok( EqualRect( &display, &virtual ), "got %s\n", wine_dbgstr_rect( &display ) ); + SetRect( &expect_rect, 0, 0, virtual.right * HIMETRIC_PER_INCH / system_dpi, + virtual.bottom * HIMETRIC_PER_INCH / system_dpi ); + todo_wine ok( EqualRect( &device, &expect_rect ), "got %s\n", wine_dbgstr_rect( &device ) ); + pSetThreadDpiAwarenessContext( old_ctx ); } } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11166