From: "Anna (navi) Figueiredo Gomes" <navi@vlhl.dev> --- dlls/user32/input.c | 63 ++++++++++++++++++++++++++++++++------ dlls/user32/misc.c | 32 +++++++++++++++++-- dlls/user32/tests/input.c | 17 ++++------ dlls/user32/user32.spec | 16 +++++----- dlls/win32u/input.c | 62 +++++++++++++++++++++++++++++-------- dlls/win32u/tests/win32u.c | 8 ++--- 6 files changed, 151 insertions(+), 47 deletions(-) diff --git a/dlls/user32/input.c b/dlls/user32/input.c index 623fab14d11..051f4e48ec9 100644 --- a/dlls/user32/input.c +++ b/dlls/user32/input.c @@ -752,16 +752,20 @@ BOOL WINAPI GetPointerDeviceProperties( HANDLE device, UINT32 *count, BOOL WINAPI GetPointerPenInfo( UINT32 id, POINTER_PEN_INFO *info ) { - FIXME( "id %u, info %p stub!\n", id, info ); - SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); - return FALSE; + UINT32 count = 1; + + TRACE( "id %u, info %p\n", id, info ); + + return NtUserGetPointerInfoList( id, PT_PEN, 0, 0, sizeof(*info), &count, &count, info ); } BOOL WINAPI GetPointerTouchInfo( UINT32 id, POINTER_TOUCH_INFO *info ) { - FIXME( "id %u, info %p stub!\n", id, info ); - SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); - return FALSE; + UINT32 count = 1; + + TRACE( "id %u, info %p stub!\n", id, info ); + + return NtUserGetPointerInfoList( id, PT_TOUCH, 0, 0, sizeof(*info), &count, &count, info ); } BOOL WINAPI GetRawPointerDeviceData( UINT32 id, UINT32 hist_count, UINT32 prop_count, @@ -775,9 +779,50 @@ BOOL WINAPI GetRawPointerDeviceData( UINT32 id, UINT32 hist_count, UINT32 prop_c BOOL WINAPI GetPointerTouchInfoHistory( UINT32 id, UINT32 *count, POINTER_TOUCH_INFO *info ) { - FIXME( "id %u, count %p, info %p stub!\n", id, count, info ); - SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); - return FALSE; + UINT32 pointers = 1; + + TRACE( "id %u, count %p, info %p\n", id, count, info ); + + return NtUserGetPointerInfoList( id, PT_TOUCH, 0, 0, sizeof(*info), count, &pointers, info ); +} + +BOOL WINAPI GetPointerPenInfoHistory( UINT32 id, UINT32 *count, POINTER_PEN_INFO *info ) +{ + UINT32 pointers = 1; + + TRACE( "id %u, count %p, info %p\n", id, count, info ); + + return NtUserGetPointerInfoList( id, PT_PEN, 0, 0, sizeof(*info), count, &pointers, info ); +} + +BOOL WINAPI GetPointerFrameTouchInfo( UINT32 id, UINT32 *count, POINTER_TOUCH_INFO *info ) +{ + UINT32 entries = 1; + + TRACE( "id %u, count %p, info %p\n", id, count, info ); + + return NtUserGetPointerInfoList( id, PT_TOUCH, 0, 0, sizeof(*info), &entries, count, info ); +} + +BOOL WINAPI GetPointerFramePenInfo( UINT32 id, UINT32 *count, POINTER_PEN_INFO *info ) +{ + UINT32 entries = 1; + + TRACE( "id %u, count %p, info %p\n", id, count, info ); + + return NtUserGetPointerInfoList( id, PT_PEN, 0, 0, sizeof(*info), &entries, count, info ); +} + +BOOL WINAPI GetPointerFrameTouchInfoHistory( UINT32 id, UINT32 *entries, UINT32 *pointers, POINTER_TOUCH_INFO *info ) +{ + TRACE( "id %u, entries %p, pointers %p, info %p\n", id, entries, pointers, info ); + return NtUserGetPointerInfoList( id, PT_TOUCH, 0, 0, sizeof(*info), entries, pointers, info ); +} + +BOOL WINAPI GetPointerFramePenInfoHistory( UINT32 id, UINT32 *entries, UINT32 *pointers, POINTER_PEN_INFO *info ) +{ + TRACE( "id %u, entries %p, pointers %p, info %p\n", id, entries, pointers, info ); + return NtUserGetPointerInfoList( id, PT_PEN, 0, 0, sizeof(*info), entries, pointers, info ); } diff --git a/dlls/user32/misc.c b/dlls/user32/misc.c index 16f02958135..764e559df19 100644 --- a/dlls/user32/misc.c +++ b/dlls/user32/misc.c @@ -519,10 +519,36 @@ BOOL WINAPI GetPointerType(UINT32 id, POINTER_INPUT_TYPE *type) BOOL WINAPI GetPointerInfo(UINT32 id, POINTER_INFO *info) { - FIXME("(%d %p): stub\n", id, info); + UINT32 count = 1; - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; + TRACE( "id %d, info %p\n", id, info ); + + return NtUserGetPointerInfoList( id, PT_POINTER, 0, 0, sizeof(*info), &count, &count, info ); +} + +BOOL WINAPI GetPointerInfoHistory( UINT32 id, UINT32 *count, POINTER_INFO *info ) +{ + UINT32 pointers = 1; + + TRACE( "id %u, count %p, info %p\n", id, count, info ); + + return NtUserGetPointerInfoList( id, PT_POINTER, 0, 0, sizeof(*info), count, &pointers, info ); +} + +BOOL WINAPI GetPointerFrameInfo( UINT32 id, UINT32 *count, POINTER_INFO *info ) +{ + UINT32 entries = 1; + + TRACE( "id %u, count %p, info %p\n", id, count, info ); + + return NtUserGetPointerInfoList( id, PT_POINTER, 0, 0, sizeof(*info), &entries, count, info ); +} + +BOOL WINAPI GetPointerFrameInfoHistory( UINT32 id, UINT32 *entries, UINT32 *pointers, POINTER_INFO *info ) +{ + TRACE( "id %u, entries %p, pointers %p, info %p\n", id, entries, pointers, info ); + + return NtUserGetPointerInfoList( id, PT_POINTER, 0, 0, sizeof(*info), entries, pointers, info ); } LRESULT WINAPI ImeWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c index d6fb9830d76..51bad80e252 100644 --- a/dlls/user32/tests/input.c +++ b/dlls/user32/tests/input.c @@ -5416,7 +5416,9 @@ static DWORD CALLBACK test_GetPointerInfo_thread( void *arg ) memset( &pointer_info, 0xcd, sizeof(pointer_info) ); ret = pGetPointerInfo( 1, &pointer_info ); + todo_wine ok( !ret, "GetPointerInfo succeeded\n" ); + todo_wine ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); DestroyWindow( hwnd ); @@ -5545,13 +5547,13 @@ static void test_GetPointerInfo( BOOL mouse_in_pointer_enabled ) 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" ); + todo_wine ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); SetCursorPos( 500, 500 ); /* avoid generating mouse message on window creation */ @@ -5563,6 +5565,7 @@ static void test_GetPointerInfo( BOOL mouse_in_pointer_enabled ) memset( pointer_info, 0xcd, sizeof(pointer_info) ); ret = pGetPointerInfo( 1, pointer_info ); ok( !ret, "GetPointerInfo succeeded\n" ); + todo_wine ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); SetCursorPos( 200, 200 ); @@ -5648,30 +5651,26 @@ static void test_GetPointerInfo( BOOL mouse_in_pointer_enabled ) memset( pointer_info, 0xcd, sizeof(pointer_info) ); ret = pGetPointerInfo( 0xdead, pointer_info ); ok( !ret, "GetPointerInfo succeeded\n" ); + todo_wine 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) { + todo_wine 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 == (0x40000 | POINTER_MESSAGE_FLAG_INRANGE), "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 ) ); @@ -5682,14 +5681,10 @@ static void test_GetPointerInfo( BOOL mouse_in_pointer_enabled ) 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 == POINTER_CHANGE_FIRSTBUTTON_UP, "got ButtonChangeType %u\n", pointer_info[0].ButtonChangeType ); thread = CreateThread( NULL, 0, test_GetPointerInfo_thread, NULL, 0, NULL ); diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec index 80dfa388dd8..2ae092d696f 100644 --- a/dlls/user32/user32.spec +++ b/dlls/user32/user32.spec @@ -632,18 +632,18 @@ @ stdcall GetPointerDeviceProperties(ptr ptr ptr) @ stdcall GetPointerDeviceRects(ptr ptr ptr) NtUserGetPointerDeviceRects @ stdcall GetPointerDevices(ptr ptr) -# @ stub GetPointerFrameInfo -# @ stub GetPointerFrameInfoHistory -# @ stub GetPointerFramePenInfo -# @ stub GetPointerFramePenInfoHistory +@ stdcall GetPointerFrameInfo(long ptr ptr) +@ stdcall GetPointerFrameInfoHistory(long ptr ptr ptr) +@ stdcall GetPointerFramePenInfo(long ptr ptr) +@ stdcall GetPointerFramePenInfoHistory(long ptr ptr ptr) # @ stub GetPointerFrameTimes -# @ stub GetPointerFrameTouchInfo -# @ stub GetPointerFrameTouchInfoHistory +@ stdcall GetPointerFrameTouchInfo(long ptr ptr) +@ stdcall GetPointerFrameTouchInfoHistory(long ptr ptr ptr) @ stdcall GetPointerInfo(long ptr) -# @ stub GetPointerInfoHistory +@ stdcall GetPointerInfoHistory(long ptr ptr) # @ stub GetPointerInputTransform @ stdcall GetPointerPenInfo(long ptr) -# @ stub GetPointerPenInfoHistory +@ stdcall GetPointerPenInfoHistory(long ptr ptr) @ stdcall GetPointerTouchInfo(long ptr) @ stdcall GetPointerTouchInfoHistory(long ptr ptr) @ stdcall GetPointerType(long ptr) diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index 982f0165bc5..eb8191c02c2 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -2735,18 +2735,6 @@ BOOL clip_fullscreen_window( HWND hwnd, BOOL reset ) return ret; } -/********************************************************************** - * NtUserGetPointerInfoList (win32u.@) - */ -BOOL WINAPI NtUserGetPointerInfoList( UINT32 id, POINTER_INPUT_TYPE type, UINT_PTR unk0, UINT_PTR unk1, SIZE_T size, - UINT32 *entry_count, UINT32 *pointer_count, void *pointer_info ) -{ - FIXME( "id %#x, type %#x, unk0 %#lx, unk1 %#lx, size %#lx, entry_count %p, pointer_count %p, pointer_info %p stub!\n", - id, type, (long)unk0, (long)unk1, size, entry_count, pointer_count, pointer_info ); - RtlSetLastWin32Error( ERROR_CALL_NOT_IMPLEMENTED ); - return FALSE; -} - static BOOL get_clip_cursor( RECT *rect, UINT dpi, MONITOR_DPI_TYPE type ) { struct object_lock lock = OBJECT_LOCK_INIT; @@ -3027,6 +3015,56 @@ BOOL WINAPI NtUserGetPointerType(UINT32 id, POINTER_INPUT_TYPE *type) return TRUE; } +/********************************************************************** + * NtUserGetPointerInfoList (win32u.@) + */ +BOOL WINAPI NtUserGetPointerInfoList( UINT32 id, POINTER_INPUT_TYPE type, UINT_PTR unk0, UINT_PTR unk1, SIZE_T size, + UINT32 *entry_count, UINT32 *pointer_count, void *pointer_info ) +{ + struct pointer *pointer; + size_t target_size = 0; + + TRACE( "id %d, type %#x, unk0 %#lx, unk1 %#lx, size %#lx, entry_count %p, pointer_count %p, pointer_info %p\n", + id, type, (long)unk0, (long)unk1, size, entry_count, pointer_count, pointer_info ); + + switch (type) + { + case PT_MOUSE: + case PT_PEN: target_size = sizeof(POINTER_PEN_INFO); break; + case PT_POINTER: target_size = sizeof(POINTER_INFO); break; + case PT_TOUCHPAD: + case PT_TOUCH: target_size = sizeof(POINTER_TOUCH_INFO); break; + } + + if (type == PT_MOUSE || size != target_size) + { + RtlSetLastWin32Error( ERROR_INVALID_PARAMETER ); + return FALSE; + } + + if (!(pointer = find_pointerid( id ))) + { + TRACE( "pointer id %d not found.\n", id ); + RtlSetLastWin32Error( ERROR_NOACCESS ); + return FALSE; + } + + if (!pointer->info.pointerId) + { + TRACE( "no info on pointer id %d.\n", id ); + RtlSetLastWin32Error( ERROR_NOACCESS ); + return FALSE; + } + + if (type != PT_POINTER && type != PT_MOUSE) + FIXME( "Pointer type %#x not implemented!", type ); + + *entry_count = 1; + *pointer_count = 1; + *(POINTER_INFO *)pointer_info = pointer->info; + return TRUE; +} + /********************************************************************** * NtUserGetPointerDeviceRects (win32u.@) */ diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index 1fd6358df39..933e9bf5ebe 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1807,9 +1807,13 @@ static DWORD CALLBACK test_NtUserGetPointerInfoList_thread( void *arg ) memset( &pointer_info, 0xcd, sizeof(pointer_info) ); entry_count = pointer_count = 2; ret = NtUserGetPointerInfoList( 1, PT_POINTER, 0, 0, sizeof(POINTER_INFO), &entry_count, &pointer_count, pointer_info ); + todo_wine ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); + todo_wine ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + todo_wine ok( pointer_count == 2, "got pointer_count %u\n", pointer_count ); + todo_wine ok( entry_count == 2, "got entry_count %u\n", entry_count ); DestroyWindow( hwnd ); @@ -1869,17 +1873,14 @@ static void test_NtUserGetPointerInfoList( BOOL mouse_in_pointer_enabled ) entry_count = pointer_count = 2; ret = NtUserGetPointerInfoList( 1, PT_POINTER, 0, 0, sizeof(POINTER_INFO), invalid_ptr, &pointer_count, pointer_info ); ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); - todo_wine ok( GetLastError() == ERROR_NOACCESS, "got error %lu\n", GetLastError() ); entry_count = pointer_count = 2; ret = NtUserGetPointerInfoList( 1, PT_POINTER, 0, 0, sizeof(POINTER_INFO), &entry_count, invalid_ptr, pointer_info ); ok( !ret, "NtUserGetPointerInfoList succeeded\n" ); - todo_wine ok( GetLastError() == ERROR_NOACCESS, "got error %lu\n", GetLastError() ); entry_count = pointer_count = 2; ret = NtUserGetPointerInfoList( 1, PT_POINTER, 0, 0, sizeof(POINTER_INFO), &entry_count, &pointer_count, invalid_ptr ); ok( !ret, "NtUserGetPointerInfoList 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) ); @@ -1918,7 +1919,6 @@ static void test_NtUserGetPointerInfoList( BOOL mouse_in_pointer_enabled ) memset( pointer_info, 0xcd, sizeof(pointer_info) ); entry_count = pointer_count = 2; ret = NtUserGetPointerInfoList( 1, PT_POINTER, 0, 0, sizeof(POINTER_INFO), &entry_count, &pointer_count, pointer_info ); - todo_wine_if(mouse_in_pointer_enabled) ok( ret == mouse_in_pointer_enabled, "NtUserGetPointerInfoList failed, error %lu\n", GetLastError() ); if (!ret) { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10649