[PATCH v5 2/3] user32: Move tracking_info to thread info struct.

Rafał Harabień rafalh1992 at o2.pl
Thu Nov 16 15:30:18 CST 2017


Signed-off-by: Rafał Harabień <rafalh1992 at o2.pl>
---
 dlls/user32/input.c        | 110 ++++++++++++++++++++++-----------------------
 dlls/user32/user_private.h |   8 ++++
 2 files changed, 61 insertions(+), 57 deletions(-)

diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index c475b19..a77127d 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -1243,45 +1243,38 @@ BOOL WINAPI UnloadKeyboardLayout(HKL hkl)
     return USER_Driver->pUnloadKeyboardLayout(hkl);
 }
 
-typedef struct __TRACKINGLIST {
-    TRACKMOUSEEVENT tme;
-    POINT pos; /* center of hover rectangle */
-} _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)
 {
-    if (tracking_info.tme.hwndTrack != hwnd)
+    struct tracking_info *tracking_info = &get_user_thread_info()->tracking_info;
+    if (tracking_info->tme.hwndTrack != hwnd)
     {
-        if (tracking_info.tme.dwFlags & TME_NONCLIENT)
-            PostMessageW(tracking_info.tme.hwndTrack, WM_NCMOUSELEAVE, 0, 0);
+        if (tracking_info->tme.dwFlags & TME_NONCLIENT)
+            PostMessageW(tracking_info->tme.hwndTrack, WM_NCMOUSELEAVE, 0, 0);
         else
-            PostMessageW(tracking_info.tme.hwndTrack, WM_MOUSELEAVE, 0, 0);
+            PostMessageW(tracking_info->tme.hwndTrack, WM_MOUSELEAVE, 0, 0);
 
         /* remove the TME_LEAVE flag */
-        tracking_info.tme.dwFlags &= ~TME_LEAVE;
+        tracking_info->tme.dwFlags &= ~TME_LEAVE;
     }
     else
     {
         if (hittest == HTCLIENT)
         {
-            if (tracking_info.tme.dwFlags & TME_NONCLIENT)
+            if (tracking_info->tme.dwFlags & TME_NONCLIENT)
             {
-                PostMessageW(tracking_info.tme.hwndTrack, WM_NCMOUSELEAVE, 0, 0);
+                PostMessageW(tracking_info->tme.hwndTrack, WM_NCMOUSELEAVE, 0, 0);
                 /* remove the TME_LEAVE flag */
-                tracking_info.tme.dwFlags &= ~TME_LEAVE;
+                tracking_info->tme.dwFlags &= ~TME_LEAVE;
             }
         }
         else
         {
-            if (!(tracking_info.tme.dwFlags & TME_NONCLIENT))
+            if (!(tracking_info->tme.dwFlags & TME_NONCLIENT))
             {
-                PostMessageW(tracking_info.tme.hwndTrack, WM_MOUSELEAVE, 0, 0);
+                PostMessageW(tracking_info->tme.hwndTrack, WM_MOUSELEAVE, 0, 0);
                 /* remove the TME_LEAVE flag */
-                tracking_info.tme.dwFlags &= ~TME_LEAVE;
+                tracking_info->tme.dwFlags &= ~TME_LEAVE;
             }
         }
     }
@@ -1292,6 +1285,7 @@ static void CALLBACK TrackMouseEventProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent,
 {
     POINT pos;
     INT hoverwidth = 0, hoverheight = 0, hittest;
+    struct tracking_info *tracking_info = &get_user_thread_info()->tracking_info;
 
     TRACE("hwnd %p, msg %04x, id %04lx, time %u\n", hwnd, uMsg, idEvent, dwTime);
 
@@ -1304,31 +1298,31 @@ static void CALLBACK TrackMouseEventProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent,
     SystemParametersInfoW(SPI_GETMOUSEHOVERHEIGHT, 0, &hoverheight, 0);
 
     TRACE("tracked pos %s, current pos %s, hover width %d, hover height %d\n",
-           wine_dbgstr_point(&tracking_info.pos), wine_dbgstr_point(&pos),
+           wine_dbgstr_point(&tracking_info->pos), wine_dbgstr_point(&pos),
            hoverwidth, hoverheight);
 
     /* see if this tracking event is looking for TME_LEAVE and that the */
     /* mouse has left the window */
-    if (tracking_info.tme.dwFlags & TME_LEAVE)
+    if (tracking_info->tme.dwFlags & TME_LEAVE)
     {
         check_mouse_leave(hwnd, hittest);
     }
 
-    if (tracking_info.tme.hwndTrack != hwnd)
+    if (tracking_info->tme.hwndTrack != hwnd)
     {
         /* mouse is gone, stop tracking mouse hover */
-        tracking_info.tme.dwFlags &= ~TME_HOVER;
+        tracking_info->tme.dwFlags &= ~TME_HOVER;
     }
 
     /* see if we are tracking hovering for this hwnd */
-    if (tracking_info.tme.dwFlags & TME_HOVER)
+    if (tracking_info->tme.dwFlags & TME_HOVER)
     {
         /* has the cursor moved outside the rectangle centered around pos? */
-        if ((abs(pos.x - tracking_info.pos.x) > (hoverwidth / 2)) ||
-            (abs(pos.y - tracking_info.pos.y) > (hoverheight / 2)))
+        if ((abs(pos.x - tracking_info->pos.x) > (hoverwidth / 2)) ||
+            (abs(pos.y - tracking_info->pos.y) > (hoverheight / 2)))
         {
             /* record this new position as the current position */
-            tracking_info.pos = pos;
+            tracking_info->pos = pos;
         }
         else
         {
@@ -1337,29 +1331,29 @@ static void CALLBACK TrackMouseEventProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent,
                 ScreenToClient(hwnd, &pos);
                 TRACE("client cursor pos %s\n", wine_dbgstr_point(&pos));
 
-                PostMessageW(tracking_info.tme.hwndTrack, WM_MOUSEHOVER,
+                PostMessageW(tracking_info->tme.hwndTrack, WM_MOUSEHOVER,
                              get_key_state(), MAKELPARAM( pos.x, pos.y ));
             }
             else
             {
-                if (tracking_info.tme.dwFlags & TME_NONCLIENT)
-                    PostMessageW(tracking_info.tme.hwndTrack, WM_NCMOUSEHOVER,
+                if (tracking_info->tme.dwFlags & TME_NONCLIENT)
+                    PostMessageW(tracking_info->tme.hwndTrack, WM_NCMOUSEHOVER,
                                  hittest, MAKELPARAM( pos.x, pos.y ));
             }
 
             /* stop tracking mouse hover */
-            tracking_info.tme.dwFlags &= ~TME_HOVER;
+            tracking_info->tme.dwFlags &= ~TME_HOVER;
         }
     }
 
     /* stop the timer if the tracking list is empty */
-    if (!(tracking_info.tme.dwFlags & (TME_HOVER | TME_LEAVE)))
+    if (!(tracking_info->tme.dwFlags & (TME_HOVER | TME_LEAVE)))
     {
-        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, tracking_info->timer);
+        tracking_info->timer = 0;
+        tracking_info->tme.hwndTrack = 0;
+        tracking_info->tme.dwFlags = 0;
+        tracking_info->tme.dwHoverTime = 0;
     }
 }
 
@@ -1393,6 +1387,7 @@ TrackMouseEvent (TRACKMOUSEEVENT *ptme)
     POINT pos;
     DWORD hover_time;
     INT hittest;
+    struct tracking_info *tracking_info = &get_user_thread_info()->tracking_info;
 
     TRACE("%x, %x, %p, %u\n", ptme->cbSize, ptme->dwFlags, ptme->hwndTrack, ptme->dwHoverTime);
 
@@ -1405,7 +1400,7 @@ TrackMouseEvent (TRACKMOUSEEVENT *ptme)
     /* fill the TRACKMOUSEEVENT struct with the current tracking for the given hwnd */
     if (ptme->dwFlags & TME_QUERY )
     {
-        *ptme = tracking_info.tme;
+        *ptme = tracking_info->tme;
         /* set cbSize in the case it's not initialized yet */
         ptme->cbSize = sizeof(TRACKMOUSEEVENT);
 
@@ -1434,52 +1429,53 @@ TrackMouseEvent (TRACKMOUSEEVENT *ptme)
 
     if (ptme->dwFlags & TME_CANCEL)
     {
-        if (tracking_info.tme.hwndTrack == ptme->hwndTrack)
+        if (tracking_info->tme.hwndTrack == ptme->hwndTrack)
         {
-            tracking_info.tme.dwFlags &= ~(ptme->dwFlags & ~TME_CANCEL);
+            tracking_info->tme.dwFlags &= ~(ptme->dwFlags & ~TME_CANCEL);
 
             /* if we aren't tracking on hover or leave remove this entry */
-            if (!(tracking_info.tme.dwFlags & (TME_HOVER | TME_LEAVE)))
+            if (!(tracking_info->tme.dwFlags & (TME_HOVER | TME_LEAVE)))
             {
-                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, tracking_info->timer);
+                tracking_info->timer = 0;
+                tracking_info->tme.hwndTrack = 0;
+                tracking_info->tme.dwFlags = 0;
+                tracking_info->tme.dwHoverTime = 0;
             }
         }
     } else {
         /* In our implementation it's possible that another window will receive a
          * WM_MOUSEMOVE and call TrackMouseEvent before TrackMouseEventProc is
          * called. In such a situation post the WM_MOUSELEAVE now */
-        if (tracking_info.tme.dwFlags & TME_LEAVE && tracking_info.tme.hwndTrack != NULL)
+        if (tracking_info->tme.dwFlags & TME_LEAVE && tracking_info->tme.hwndTrack != NULL)
             check_mouse_leave(hwnd, hittest);
 
-        if (timer)
+        if (tracking_info->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, tracking_info->timer);
+            tracking_info->timer = 0;
+            tracking_info->tme.hwndTrack = 0;
+            tracking_info->tme.dwFlags = 0;
+            tracking_info->tme.dwHoverTime = 0;
         }
 
         if (ptme->hwndTrack == hwnd)
         {
             /* Adding new mouse event to the tracking list */
-            tracking_info.tme = *ptme;
-            tracking_info.tme.dwHoverTime = hover_time;
+            tracking_info->tme = *ptme;
+            tracking_info->tme.dwHoverTime = hover_time;
 
             /* Initialize HoverInfo variables even if not hover tracking */
-            tracking_info.pos = pos;
+            tracking_info->pos = pos;
 
-            timer = SetSystemTimer(tracking_info.tme.hwndTrack, (UINT_PTR)&tracking_info.tme, hover_time, TrackMouseEventProc);
+            tracking_info->timer = SetSystemTimer(tracking_info->tme.hwndTrack, (UINT_PTR)&tracking_info->tme, hover_time, TrackMouseEventProc);
         }
     }
 
     return TRUE;
 }
 
+
 /***********************************************************************
  * GetMouseMovePointsEx [USER32]
  *
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index 052fdd8..d7cfada 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -163,6 +163,13 @@ struct wm_char_mapping_data
     MSG  get_msg;
 };
 
+/* data for TrackMouseEvent */
+struct tracking_info {
+    TRACKMOUSEEVENT tme;
+    POINT           pos; /* center of hover rectangle */
+    UINT_PTR        timer;
+};
+
 /* this is the structure stored in TEB->Win32ClientInfo */
 /* no attempt is made to keep the layout compatible with the Windows one */
 struct user_thread_info
@@ -185,6 +192,7 @@ struct user_thread_info
     HWND                          top_window;             /* Desktop window */
     HWND                          msg_window;             /* HWND_MESSAGE parent window */
     RAWINPUT                     *rawinput;
+    struct tracking_info          tracking_info;
 };
 
 C_ASSERT( sizeof(struct user_thread_info) <= sizeof(((TEB *)0)->Win32ClientInfo) );
-- 
2.7.4




More information about the wine-devel mailing list