From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/user32/tests/monitor.c | 50 ++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c index eaf3d268469..be5882405f0 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; @@ -3233,16 +3235,26 @@ static void test_monitor_dpi_awareness( const struct monitor_info *infos, UINT c { if (infos[i].rect.left == 0 && infos[i].rect.top == 0) primary = infos[i].rect; - if (info != infos + i) UnionRect( &scaled_virtual, &scaled_virtual, &infos[i].rect ); + SetRect( &device, infos[i].rect.left * HIMETRIC_PER_INCH / system_dpi, infos[i].rect.top * HIMETRIC_PER_INCH / system_dpi, + infos[i].rect.right * HIMETRIC_PER_INCH / system_dpi, infos[i].rect.bottom * HIMETRIC_PER_INCH / system_dpi ); + UnionRect( &virtual, &virtual, &infos[i].rect ); + UnionRect( &expect_device, &expect_device, &device ); + + if (info != infos + i) + { + UnionRect( &scaled_virtual, &scaled_virtual, &infos[i].rect ); + UnionRect( &scaled_device, &scaled_device, &device ); + } else { scaled = monitor = infos[i].rect; scaled.right = scaled.left + MulDiv( scaled.right - scaled.left, 100, scale ); scaled.bottom = scaled.top + MulDiv( scaled.bottom - scaled.top, 100, scale ); UnionRect( &scaled_virtual, &scaled_virtual, &scaled ); + SetRect( &device, scaled.left * HIMETRIC_PER_INCH / system_dpi, scaled.top * HIMETRIC_PER_INCH / system_dpi, + scaled.right * HIMETRIC_PER_INCH / system_dpi, scaled.bottom * HIMETRIC_PER_INCH / system_dpi ); + UnionRect( &scaled_device, &scaled_device, &device ); } - - UnionRect( &virtual, &virtual, &infos[i].rect ); } unaware_hwnd = CreateWindowW( L"static", NULL, WS_POPUP | WS_VISIBLE, monitor.left + 100, @@ -3279,6 +3291,12 @@ 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 ); + 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) ); + todo_wine ok( EqualRect( &device, &expect_device ) /* w10 */ || EqualRect( &device, &scaled_device ) /* w11 */, + "got %s vs %s / %s\n", wine_dbgstr_rect(&device), wine_dbgstr_rect(&expect_device), wine_dbgstr_rect(&scaled_device) ); + for (i = 0; i < ARRAY_SIZE(tests); i++) { BOOL monitor_aware = tests[i] == DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE || @@ -3565,6 +3583,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 / %s\n", wine_dbgstr_rect(&device), wine_dbgstr_rect(&expect_device), wine_dbgstr_rect(&scaled_device) ); + DestroyWindow( primary_hwnd ); DestroyWindow( aware_hwnd ); @@ -3630,6 +3654,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 +3685,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 +3732,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 +3779,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/11162