Jacek Caban : win32u: Move NtUserGetCursorFrameInfo implementation from user32.

Alexandre Julliard julliard at winehq.org
Wed Feb 23 16:00:06 CST 2022


Module: wine
Branch: master
Commit: 0885c7cc5a901005ce8611f410f360f5df80bba5
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=0885c7cc5a901005ce8611f410f360f5df80bba5

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Feb 23 13:40:14 2022 +0100

win32u: Move NtUserGetCursorFrameInfo implementation from user32.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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);




More information about the wine-cvs mailing list