Module: wine Branch: master Commit: 0885c7cc5a901005ce8611f410f360f5df80bba5 URL: https://source.winehq.org/git/wine.git/?a=commit;h=0885c7cc5a901005ce8611f41...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Feb 23 13:40:14 2022 +0100
win32u: Move NtUserGetCursorFrameInfo implementation from user32.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/cursoricon.c | 55 +++------------------------------------------ dlls/win32u/cursoricon.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++ dlls/win32u/syscall.c | 1 + dlls/win32u/tests/win32u.c | 8 +++++++ dlls/win32u/win32u.spec | 2 +- dlls/wow64win/syscall.h | 1 + dlls/wow64win/user.c | 10 +++++++++ include/ntuser.h | 2 ++ 8 files changed, 82 insertions(+), 53 deletions(-)
diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c index 26c82c2c70c..a6a788565f4 100644 --- a/dlls/user32/cursoricon.c +++ b/dlls/user32/cursoricon.c @@ -1835,59 +1835,10 @@ HICON WINAPI LoadIconA(HINSTANCE hInstance, LPCSTR name) * Success: Handle to a frame of the cursor (specified by istep) * Failure: NULL cursor (0) */ -HCURSOR WINAPI GetCursorFrameInfo(HCURSOR hCursor, DWORD reserved, DWORD istep, DWORD *rate_jiffies, DWORD *num_steps) +HCURSOR WINAPI GetCursorFrameInfo( HCURSOR handle, DWORD reserved, DWORD istep, + DWORD *rate_jiffies, DWORD *num_steps ) { - struct cursoricon_object *ptr; - HCURSOR ret = 0; - UINT icon_steps; - - if (rate_jiffies == NULL || num_steps == NULL) return 0; - - if (!(ptr = get_icon_ptr( hCursor ))) return 0; - - TRACE("%p => %d %d %p %p\n", hCursor, reserved, istep, rate_jiffies, num_steps); - if (reserved != 0) - FIXME("Second parameter non-zero (%d), please report this!\n", reserved); - - icon_steps = get_icon_steps(ptr); - if (istep < icon_steps || !ptr->is_ani) - { - UINT icon_frames = 1; - - if (ptr->is_ani) - icon_frames = ptr->ani.num_frames; - if (ptr->is_ani && icon_frames > 1) - ret = ptr->ani.frames[istep]; - else - ret = hCursor; - if (icon_frames == 1) - { - *rate_jiffies = 0; - *num_steps = 1; - } - else if (icon_steps == 1) - { - *num_steps = ~0; - *rate_jiffies = ptr->delay; - } - else if (istep < icon_steps) - { - struct cursoricon_object *frame; - - *num_steps = icon_steps; - frame = get_icon_ptr( ptr->ani.frames[istep] ); - if (ptr->ani.num_steps == 1) - *num_steps = ~0; - else - *num_steps = ptr->ani.num_steps; - *rate_jiffies = frame->delay; - release_user_handle_ptr( frame ); - } - } - - release_user_handle_ptr( ptr ); - - return ret; + return NtUserGetCursorFrameInfo( handle, istep, rate_jiffies, num_steps ); }
/********************************************************************** diff --git a/dlls/win32u/cursoricon.c b/dlls/win32u/cursoricon.c index f0a9c1b0609..43481f09b09 100644 --- a/dlls/win32u/cursoricon.c +++ b/dlls/win32u/cursoricon.c @@ -438,3 +438,59 @@ BOOL WINAPI NtUserGetIconSize( HICON handle, UINT step, LONG *width, LONG *heigh release_user_handle_ptr( obj ); return TRUE; } + +/********************************************************************** + * NtUserGetCursorFrameInfo (win32u.@) + */ +HCURSOR WINAPI NtUserGetCursorFrameInfo( HCURSOR cursor, DWORD istep, DWORD *rate_jiffies, + DWORD *num_steps ) +{ + struct cursoricon_object *obj; + HCURSOR ret = 0; + UINT icon_steps; + + if (!rate_jiffies || !num_steps) return 0; + + if (!(obj = get_icon_ptr( cursor ))) return 0; + + TRACE( "%p => %d %p %p\n", cursor, istep, rate_jiffies, num_steps ); + + icon_steps = obj->is_ani ? obj->ani.num_steps : 1; + if (istep < icon_steps || !obj->is_ani) + { + UINT icon_frames = 1; + + if (obj->is_ani) + icon_frames = obj->ani.num_frames; + if (obj->is_ani && icon_frames > 1) + ret = obj->ani.frames[istep]; + else + ret = cursor; + if (icon_frames == 1) + { + *rate_jiffies = 0; + *num_steps = 1; + } + else if (icon_steps == 1) + { + *num_steps = ~0; + *rate_jiffies = obj->delay; + } + else if (istep < icon_steps) + { + struct cursoricon_object *frame; + + *num_steps = icon_steps; + frame = get_icon_ptr( obj->ani.frames[istep] ); + if (obj->ani.num_steps == 1) + *num_steps = ~0; + else + *num_steps = obj->ani.num_steps; + *rate_jiffies = frame->delay; + release_user_handle_ptr( frame ); + } + } + + release_user_handle_ptr( obj ); + return ret; +} diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c index 54d9d6ea754..d2a401b0d76 100644 --- a/dlls/win32u/syscall.c +++ b/dlls/win32u/syscall.c @@ -114,6 +114,7 @@ static void * const syscalls[] = NtUserGetClipboardSequenceNumber, NtUserGetClipboardViewer, NtUserGetCursor, + NtUserGetCursorFrameInfo, NtUserGetDoubleClickTime, NtUserGetDpiForMonitor, NtUserGetForegroundWindow, diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index 980ba23bd73..77a0eaf6b9a 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -184,6 +184,8 @@ static void test_cursoricon(void) { BYTE bmp_bits[1024]; LONG width, height; + DWORD rate, steps; + HCURSOR frame; HANDLE handle; unsigned int i; BOOL ret; @@ -204,6 +206,12 @@ static void test_cursoricon(void) ok( width == 16, "width = %ld\n", width ); ok( height == 32, "height = %ld\n", height );
+ frame = NtUserGetCursorFrameInfo( handle, 0, &rate, &steps ); + ok( frame != NULL, "NtUserGetCursorFrameInfo failed: %lu\n", GetLastError() ); + ok( frame == handle, "frame != handle\n" ); + ok( rate == 0, "rate = %lu\n", rate ); + ok( steps == 1, "steps = %lu\n", steps ); + ret = NtUserDestroyCursor( handle, 0 ); ok( ret, "NtUserDestroyIcon failed: %lu\n", GetLastError() );
diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index dddc3a5b187..29994ffb575 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -913,7 +913,7 @@ @ stub NtUserGetCurrentDpiInfoForWindow @ stub NtUserGetCurrentInputMessageSource @ stdcall -syscall NtUserGetCursor() -@ stub NtUserGetCursorFrameInfo +@ stdcall -syscall NtUserGetCursorFrameInfo(long long ptr ptr) @ stub NtUserGetCursorInfo @ stub NtUserGetDC @ stub NtUserGetDCEx diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h index 0908c2db019..5a10fb4f8bd 100644 --- a/dlls/wow64win/syscall.h +++ b/dlls/wow64win/syscall.h @@ -101,6 +101,7 @@ SYSCALL_ENTRY( NtUserGetClipboardSequenceNumber ) \ SYSCALL_ENTRY( NtUserGetClipboardViewer ) \ SYSCALL_ENTRY( NtUserGetCursor ) \ + SYSCALL_ENTRY( NtUserGetCursorFrameInfo ) \ SYSCALL_ENTRY( NtUserGetDoubleClickTime ) \ SYSCALL_ENTRY( NtUserGetDpiForMonitor ) \ SYSCALL_ENTRY( NtUserGetForegroundWindow ) \ diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 6b50f545948..72c0222555e 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -289,6 +289,16 @@ NTSTATUS WINAPI wow64_NtUserGetIconSize( UINT *args ) return NtUserGetIconSize( handle, step, width, height ); }
+NTSTATUS WINAPI wow64_NtUserGetCursorFrameInfo( UINT *args ) +{ + HCURSOR cursor = get_ptr( &args ); + DWORD istep = get_ulong( &args ); + DWORD *rate_jiffies = get_ptr( &args ); + DWORD *num_steps = get_ptr( &args ); + + return HandleToUlong( NtUserGetCursorFrameInfo( cursor, istep, rate_jiffies, num_steps )); +} + NTSTATUS WINAPI wow64_NtUserAttachThreadInput( UINT *args ) { DWORD from = get_ulong( &args ); diff --git a/include/ntuser.h b/include/ntuser.h index 6c6e6518297..37eb6500a4c 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -199,6 +199,8 @@ HWND WINAPI NtUserGetClipboardOwner(void); DWORD WINAPI NtUserGetClipboardSequenceNumber(void); HWND WINAPI NtUserGetClipboardViewer(void); HCURSOR WINAPI NtUserGetCursor(void); +HCURSOR WINAPI NtUserGetCursorFrameInfo( HCURSOR hCursor, DWORD istep, DWORD *rate_jiffies, + DWORD *num_steps ); LONG WINAPI NtUserGetDisplayConfigBufferSizes( UINT32 flags, UINT32 *num_path_info, UINT32 *num_mode_info ); UINT WINAPI NtUserGetDoubleClickTime(void);