[PATCH v2 3/6] win32u: Update mouse tracking information based on the timer ID in NtUserDispatchMessage().

Zebediah Figura zfigura at codeweavers.com
Fri Apr 15 13:28:25 CDT 2022


Avoid passing a callback to NtUserSetSystemTimer(); it does not support one.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/user32/input.c          | 27 +++++++++------------------
 dlls/user32/user_main.c      |  1 +
 dlls/user32/user_private.h   |  1 +
 dlls/win32u/message.c        |  5 +++++
 dlls/win32u/ntuser_private.h |  2 ++
 5 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index 5a1d82eb7a7..6c0eb82b04f 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -527,7 +527,6 @@ typedef struct __TRACKINGLIST {
 
 /* FIXME: move tracking stuff into a per thread data */
 static _TRACKINGLIST tracking_info;
-static UINT_PTR timer;
 
 static void check_mouse_leave(HWND hwnd, int hittest)
 {
@@ -564,13 +563,12 @@ static void check_mouse_leave(HWND hwnd, int hittest)
     }
 }
 
-static void CALLBACK TrackMouseEventProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent,
-                                         DWORD dwTime)
+void CDECL update_mouse_tracking_info( HWND hwnd )
 {
     POINT pos;
     INT hoverwidth = 0, hoverheight = 0, hittest;
 
-    TRACE("hwnd %p, msg %04x, id %04lx, time %u\n", hwnd, uMsg, idEvent, dwTime);
+    TRACE( "hwnd %p\n", hwnd );
 
     GetCursorPos(&pos);
     hwnd = WINPOS_WindowFromPoint(hwnd, pos, &hittest);
@@ -632,8 +630,7 @@ static void CALLBACK TrackMouseEventProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent,
     /* stop the timer if the tracking list is empty */
     if (!(tracking_info.tme.dwFlags & (TME_HOVER | TME_LEAVE)))
     {
-        KillSystemTimer(tracking_info.tme.hwndTrack, timer);
-        timer = 0;
+        KillSystemTimer( tracking_info.tme.hwndTrack, SYSTEM_TIMER_TRACK_MOUSE );
         tracking_info.tme.hwndTrack = 0;
         tracking_info.tme.dwFlags = 0;
         tracking_info.tme.dwHoverTime = 0;
@@ -718,8 +715,7 @@ TrackMouseEvent (TRACKMOUSEEVENT *ptme)
             /* if we aren't tracking on hover or leave remove this entry */
             if (!(tracking_info.tme.dwFlags & (TME_HOVER | TME_LEAVE)))
             {
-                KillSystemTimer(tracking_info.tme.hwndTrack, timer);
-                timer = 0;
+                KillSystemTimer( tracking_info.tme.hwndTrack, SYSTEM_TIMER_TRACK_MOUSE );
                 tracking_info.tme.hwndTrack = 0;
                 tracking_info.tme.dwFlags = 0;
                 tracking_info.tme.dwHoverTime = 0;
@@ -732,14 +728,10 @@ TrackMouseEvent (TRACKMOUSEEVENT *ptme)
         if (tracking_info.tme.dwFlags & TME_LEAVE && tracking_info.tme.hwndTrack != NULL)
             check_mouse_leave(hwnd, hittest);
 
-        if (timer)
-        {
-            KillSystemTimer(tracking_info.tme.hwndTrack, timer);
-            timer = 0;
-            tracking_info.tme.hwndTrack = 0;
-            tracking_info.tme.dwFlags = 0;
-            tracking_info.tme.dwHoverTime = 0;
-        }
+        KillSystemTimer( tracking_info.tme.hwndTrack, SYSTEM_TIMER_TRACK_MOUSE );
+        tracking_info.tme.hwndTrack = 0;
+        tracking_info.tme.dwFlags = 0;
+        tracking_info.tme.dwHoverTime = 0;
 
         if (ptme->hwndTrack == hwnd)
         {
@@ -750,8 +742,7 @@ TrackMouseEvent (TRACKMOUSEEVENT *ptme)
             /* Initialize HoverInfo variables even if not hover tracking */
             tracking_info.pos = pos;
 
-            timer = NtUserSetSystemTimer( tracking_info.tme.hwndTrack, (UINT_PTR)&tracking_info.tme,
-                                          hover_time, TrackMouseEventProc );
+            NtUserSetSystemTimer( tracking_info.tme.hwndTrack, SYSTEM_TIMER_TRACK_MOUSE, hover_time, NULL );
         }
     }
 
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c
index 6d2735cc9ec..30fe6dcce78 100644
--- a/dlls/user32/user_main.c
+++ b/dlls/user32/user_main.c
@@ -178,6 +178,7 @@ static const struct user_callbacks user_funcs =
     SCROLL_SetStandardScrollPainted,
     toggle_caret,
     unpack_dde_message,
+    update_mouse_tracking_info,
     register_imm,
     unregister_imm,
 };
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index 96c47a71753..54b11f2a8ef 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -100,6 +100,7 @@ extern void SYSPARAMS_Init(void) DECLSPEC_HIDDEN;
 extern void USER_CheckNotLock(void) DECLSPEC_HIDDEN;
 extern BOOL USER_IsExitingThread( DWORD tid ) DECLSPEC_HIDDEN;
 extern void CDECL toggle_caret( HWND hwnd ) DECLSPEC_HIDDEN;
+extern void CDECL update_mouse_tracking_info( HWND hwnd ) DECLSPEC_HIDDEN;
 
 typedef LRESULT (*winproc_callback_t)( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp,
                                        LRESULT *result, void *arg );
diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c
index 24dec5d529f..d75d42c7854 100644
--- a/dlls/win32u/message.c
+++ b/dlls/win32u/message.c
@@ -2476,6 +2476,11 @@ LRESULT dispatch_message( const MSG *msg, BOOL ansi )
                 if (!user_callbacks) break;
                 user_callbacks->toggle_caret( msg->hwnd );
                 return 0;
+
+            case SYSTEM_TIMER_TRACK_MOUSE:
+                if (!user_callbacks) break;
+                user_callbacks->update_mouse_tracking_info( msg->hwnd );
+                return 0;
         }
     }
 
diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h
index 0cbe77a2959..e53ef33bb8f 100644
--- a/dlls/win32u/ntuser_private.h
+++ b/dlls/win32u/ntuser_private.h
@@ -54,6 +54,7 @@ struct user_callbacks
     void (CDECL *toggle_caret)( HWND hwnd );
     BOOL (CDECL *unpack_dde_message)( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam,
                                       void **buffer, size_t size );
+    void (CDECL *update_mouse_tracking_info)( HWND hwnd );
     BOOL (WINAPI *register_imm)( HWND hwnd );
     void (WINAPI *unregister_imm)( HWND hwnd );
 };
@@ -63,6 +64,7 @@ struct user_callbacks
 
 enum system_timer_id
 {
+    SYSTEM_TIMER_TRACK_MOUSE = 0xfffa,
     SYSTEM_TIMER_CARET = 0xffff,
 };
 
-- 
2.35.1




More information about the wine-devel mailing list