Module: wine Branch: master Commit: d4aaf273337dfea7a08db51d3c47df78fe22fc94 URL: https://gitlab.winehq.org/wine/wine/-/commit/d4aaf273337dfea7a08db51d3c47df7...
Author: Rémi Bernon rbernon@codeweavers.com Date: Mon Dec 19 11:39:38 2022 +0100
user32/tests: Test GetPointerInfo behavior with EnableMouseInPointer.
---
dlls/user32/tests/input.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+)
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c index 3f9ad8b184f..06d4f122941 100644 --- a/dlls/user32/tests/input.c +++ b/dlls/user32/tests/input.c @@ -4594,6 +4594,140 @@ static void test_SendInput(void) DestroyWindow( hwnd ); }
+static DWORD CALLBACK test_GetPointerInfo_thread( void *arg ) +{ + POINTER_INFO pointer_info; + HWND hwnd; + BOOL ret; + + hwnd = CreateWindowW( L"test", L"test name", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, + 200, 0, 0, NULL, 0 ); + + memset( &pointer_info, 0xcd, sizeof(pointer_info) ); + ret = pGetPointerInfo( 1, &pointer_info ); + ok( !ret, "GetPointerInfo succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + + DestroyWindow( hwnd ); + + return 0; +} + +static void test_GetPointerInfo( BOOL mouse_in_pointer_enabled ) +{ + void *invalid_ptr = (void *)0xdeadbeef; + POINTER_INFO pointer_info[4]; + WNDCLASSW cls = + { + .lpfnWndProc = DefWindowProcW, + .hInstance = GetModuleHandleW( NULL ), + .hbrBackground = GetStockObject( WHITE_BRUSH ), + .lpszClassName = L"test", + }; + HANDLE thread; + ATOM class; + DWORD res; + HWND hwnd; + BOOL ret; + + if (!pGetPointerInfo) + { + todo_wine + win_skip( "GetPointerInfo not found, skipping tests\n" ); + return; + } + + class = RegisterClassW( &cls ); + ok( class, "RegisterClassW failed: %lu\n", GetLastError() ); + + ret = pGetPointerInfo( 1, invalid_ptr ); + ok( !ret, "GetPointerInfo succeeded\n" ); + todo_wine + ok( GetLastError() == ERROR_NOACCESS || broken(GetLastError() == ERROR_INVALID_PARAMETER) /* w10 32bit */, + "got error %lu\n", GetLastError() ); + + memset( pointer_info, 0xcd, sizeof(pointer_info) ); + ret = pGetPointerInfo( 1, pointer_info ); + ok( !ret, "GetPointerInfo succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + + SetCursorPos( 500, 500 ); /* avoid generating mouse message on window creation */ + + hwnd = CreateWindowW( L"test", L"test name", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, + 200, 0, 0, NULL, 0 ); + empty_message_queue(); + + memset( pointer_info, 0xcd, sizeof(pointer_info) ); + ret = pGetPointerInfo( 1, pointer_info ); + ok( !ret, "GetPointerInfo succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + + SetCursorPos( 200, 200 ); + empty_message_queue(); + mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 ); + empty_message_queue(); + mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ); + empty_message_queue(); + mouse_event( MOUSEEVENTF_MOVE, 10, 10, 0, 0 ); + empty_message_queue(); + + memset( pointer_info, 0xcd, sizeof(pointer_info) ); + ret = pGetPointerInfo( 0xdead, pointer_info ); + ok( !ret, "GetPointerInfo succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + + memset( pointer_info, 0xcd, sizeof(pointer_info) ); + ret = pGetPointerInfo( 1, pointer_info ); + todo_wine_if(mouse_in_pointer_enabled) + ok( ret == mouse_in_pointer_enabled, "GetPointerInfo failed, error %lu\n", GetLastError() ); + if (!mouse_in_pointer_enabled) + { + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + return; + } + + todo_wine + ok( pointer_info[0].pointerType == PT_MOUSE, "got pointerType %lu\n", pointer_info[0].pointerType ); + todo_wine + ok( pointer_info[0].pointerId == 1, "got pointerId %u\n", pointer_info[0].pointerId ); + ok( !!pointer_info[0].frameId, "got frameId %u\n", pointer_info[0].frameId ); + todo_wine + ok( pointer_info[0].pointerFlags == (0x20000 | POINTER_MESSAGE_FLAG_INRANGE | POINTER_MESSAGE_FLAG_PRIMARY), + "got pointerFlags %#x\n", pointer_info[0].pointerFlags ); + todo_wine + ok( pointer_info[0].sourceDevice == INVALID_HANDLE_VALUE || broken(!!pointer_info[0].sourceDevice) /* < w10 & 32bit */, + "got sourceDevice %p\n", pointer_info[0].sourceDevice ); + todo_wine + ok( pointer_info[0].hwndTarget == hwnd, "got hwndTarget %p\n", pointer_info[0].hwndTarget ); + ok( !!pointer_info[0].ptPixelLocation.x, "got ptPixelLocation %s\n", wine_dbgstr_point( &pointer_info[0].ptPixelLocation ) ); + ok( !!pointer_info[0].ptPixelLocation.y, "got ptPixelLocation %s\n", wine_dbgstr_point( &pointer_info[0].ptPixelLocation ) ); + ok( !!pointer_info[0].ptHimetricLocation.x, "got ptHimetricLocation %s\n", wine_dbgstr_point( &pointer_info[0].ptHimetricLocation ) ); + ok( !!pointer_info[0].ptHimetricLocation.y, "got ptHimetricLocation %s\n", wine_dbgstr_point( &pointer_info[0].ptHimetricLocation ) ); + ok( !!pointer_info[0].ptPixelLocationRaw.x, "got ptPixelLocationRaw %s\n", wine_dbgstr_point( &pointer_info[0].ptPixelLocationRaw ) ); + ok( !!pointer_info[0].ptPixelLocationRaw.y, "got ptPixelLocationRaw %s\n", wine_dbgstr_point( &pointer_info[0].ptPixelLocationRaw ) ); + ok( !!pointer_info[0].ptHimetricLocationRaw.x, "got ptHimetricLocationRaw %s\n", wine_dbgstr_point( &pointer_info[0].ptHimetricLocationRaw ) ); + ok( !!pointer_info[0].ptHimetricLocationRaw.y, "got ptHimetricLocationRaw %s\n", wine_dbgstr_point( &pointer_info[0].ptHimetricLocationRaw ) ); + ok( !!pointer_info[0].dwTime, "got dwTime %lu\n", pointer_info[0].dwTime ); + todo_wine + ok( pointer_info[0].historyCount == 1, "got historyCount %u\n", pointer_info[0].historyCount ); + todo_wine + ok( pointer_info[0].InputData == 0, "got InputData %u\n", pointer_info[0].InputData ); + todo_wine + ok( pointer_info[0].dwKeyStates == 0, "got dwKeyStates %lu\n", pointer_info[0].dwKeyStates ); + ok( !!pointer_info[0].PerformanceCount, "got PerformanceCount %I64u\n", pointer_info[0].PerformanceCount ); + todo_wine + ok( pointer_info[0].ButtonChangeType == 0, "got ButtonChangeType %u\n", pointer_info[0].ButtonChangeType ); + + thread = CreateThread( NULL, 0, test_GetPointerInfo_thread, NULL, 0, NULL ); + res = WaitForSingleObject( thread, 5000 ); + ok( !res, "WaitForSingleObject returned %#lx, error %lu\n", res, GetLastError() ); + + DestroyWindow( hwnd ); + + ret = UnregisterClassW( L"test", GetModuleHandleW( NULL ) ); + ok( ret, "UnregisterClassW failed: %lu\n", GetLastError() ); +} + static void test_EnableMouseInPointer_process( const char *arg ) { DWORD enable = strtoul( arg, 0, 10 ); @@ -4620,6 +4754,8 @@ static void test_EnableMouseInPointer_process( const char *arg ) else ret = pIsMouseInPointerEnabled(); todo_wine_if(!pIsMouseInPointerEnabled) ok( ret == enable, "IsMouseInPointerEnabled returned %u, error %lu\n", ret, GetLastError() ); + + test_GetPointerInfo( enable ); }
static void test_EnableMouseInPointer( char **argv, BOOL enable )