[ros-diffs] [jimtabor] 23387: Sync up changes for IntCallWndProcA/W and TrackMouseEvent.

jimtabor at svn.reactos.org jimtabor at svn.reactos.org
Mon Jul 31 07:44:23 CEST 2006


Author: jimtabor
Date: Mon Jul 31 09:44:22 2006
New Revision: 23387

URL: http://svn.reactos.org/svn/reactos?rev=23387&view=rev
Log:
Sync up changes for IntCallWndProcA/W and TrackMouseEvent.

Modified:
    branches/ros-branch-0_3_0/reactos/dll/win32/user32/windows/input.c
    branches/ros-branch-0_3_0/reactos/dll/win32/user32/windows/message.c

Modified: branches/ros-branch-0_3_0/reactos/dll/win32/user32/windows/input.c
URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win32/user32/windows/input.c?rev=23387&r1=23386&r2=23387&view=diff
==============================================================================
--- branches/ros-branch-0_3_0/reactos/dll/win32/user32/windows/input.c (original)
+++ branches/ros-branch-0_3_0/reactos/dll/win32/user32/windows/input.c Mon Jul 31 09:44:22 2006
@@ -38,11 +38,10 @@
 typedef struct __TRACKINGLIST {
     TRACKMOUSEEVENT tme;
     POINT pos; /* center of hover rectangle */
-    INT iHoverTime; /* elapsed time the cursor has been inside of the hover rect */
 } _TRACKINGLIST;
 
-static _TRACKINGLIST TrackingList[10];
-static int iTrackMax = 0;
+/* FIXME: move tracking stuff into a per thread data */
+static _TRACKINGLIST tracking_info;
 static UINT_PTR timer;
 static const INT iTimerInterval = 50; /* msec for timer interval */
 
@@ -715,113 +714,96 @@
     return ret;
 }
 
-
 static void CALLBACK TrackMouseEventProc(HWND hwndUnused, UINT uMsg, UINT_PTR idEvent,
     DWORD dwTime)
 {
-    int i = 0;
     POINT pos;
     POINT posClient;
     HWND hwnd;
-    INT nonclient;
     INT hoverwidth = 0, hoverheight = 0;
     RECT client;
 
     GetCursorPos(&pos);
     hwnd = WindowFromPoint(pos);
 
-    SystemParametersInfoA(SPI_GETMOUSEHOVERWIDTH, 0, &hoverwidth, 0);
-    SystemParametersInfoA(SPI_GETMOUSEHOVERHEIGHT, 0, &hoverheight, 0);
-
-    /* loop through tracking events we are processing */
-    while (i < iTrackMax) {
-        if (TrackingList[i].tme.dwFlags & TME_NONCLIENT) {
-            nonclient = 1;
+//    SystemParametersInfoW(SPI_GETMOUSEHOVERWIDTH, 0, &hoverwidth, 0);
+    hoverwidth = 4;
+//    SystemParametersInfoW(SPI_GETMOUSEHOVERHEIGHT, 0, &hoverheight, 0);
+    hoverheight = 4;
+
+    /* 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.hwndTrack != hwnd)
+        {
+            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);
+
+            /* remove the TME_LEAVE flag */
+            tracking_info.tme.dwFlags &= ~TME_LEAVE;
         }
-        else {
-            nonclient = 0;
-        }
-
-        /* see if this tracking event is looking for TME_LEAVE and that the */
-        /* mouse has left the window */
-        if (TrackingList[i].tme.dwFlags & TME_LEAVE) {
-            if (TrackingList[i].tme.hwndTrack != hwnd) {
-                if (nonclient) {
-                    PostMessageA(TrackingList[i].tme.hwndTrack, WM_NCMOUSELEAVE, 0, 0);
+        else
+        {
+            GetClientRect(hwnd, &client);
+            MapWindowPoints(hwnd, NULL, (LPPOINT)&client, 2);
+            if (PtInRect(&client, pos))
+            {
+                if (tracking_info.tme.dwFlags & TME_NONCLIENT)
+                {
+                    PostMessageW(tracking_info.tme.hwndTrack, WM_NCMOUSELEAVE, 0, 0);
+                    /* remove the TME_LEAVE flag */
+                    tracking_info.tme.dwFlags &= ~TME_LEAVE;
                 }
-                else {
-                    PostMessageA(TrackingList[i].tme.hwndTrack, WM_MOUSELEAVE, 0, 0);
-                }
-
-                /* remove the TME_LEAVE flag */
-                TrackingList[i].tme.dwFlags ^= TME_LEAVE;
             }
-            else {
-                GetClientRect(hwnd, &client);
-                MapWindowPoints(hwnd, NULL, (LPPOINT)&client, 2);
-                if(PtInRect(&client, pos)) {
-                    if (nonclient) {
-                        PostMessageA(TrackingList[i].tme.hwndTrack, WM_NCMOUSELEAVE, 0, 0);
-                        /* remove the TME_LEAVE flag */
-                        TrackingList[i].tme.dwFlags ^= TME_LEAVE;
-                    }
-                }
-                else {
-                    if (!nonclient) {
-                        PostMessageA(TrackingList[i].tme.hwndTrack, WM_MOUSELEAVE, 0, 0);
-                        /* remove the TME_LEAVE flag */
-                        TrackingList[i].tme.dwFlags ^= TME_LEAVE;
-                    }
+            else
+            {
+                if (!(tracking_info.tme.dwFlags & TME_NONCLIENT))
+                {
+                    PostMessageW(tracking_info.tme.hwndTrack, WM_MOUSELEAVE, 0, 0);
+                    /* remove the TME_LEAVE flag */
+                    tracking_info.tme.dwFlags &= ~TME_LEAVE;
                 }
             }
         }
-
-        /* see if we are tracking hovering for this hwnd */
-        if(TrackingList[i].tme.dwFlags & TME_HOVER) {
-            /* add the timer interval to the hovering time */
-            TrackingList[i].iHoverTime+=iTimerInterval;
-
-            /* has the cursor moved outside the rectangle centered around pos? */
-            if((abs(pos.x - TrackingList[i].pos.x) > (hoverwidth / 2.0))
-              || (abs(pos.y - TrackingList[i].pos.y) > (hoverheight / 2.0)))
-            {
-                /* record this new position as the current position and reset */
-                /* the iHoverTime variable to 0 */
-                TrackingList[i].pos = pos;
-                TrackingList[i].iHoverTime = 0;
-            }
-
-            /* has the mouse hovered long enough? */
-            if(TrackingList[i].iHoverTime <= TrackingList[i].tme.dwHoverTime)
-            {
-                posClient.x = pos.x;
-                posClient.y = pos.y;
-                ScreenToClient(hwnd, &posClient);
-                if (nonclient) {
-                    PostMessageW(TrackingList[i].tme.hwndTrack, WM_NCMOUSEHOVER,
-                                get_key_state(), MAKELPARAM( posClient.x, posClient.y ));
-                }
-                else {
-                    PostMessageW(TrackingList[i].tme.hwndTrack, WM_MOUSEHOVER,
-                                get_key_state(), MAKELPARAM( posClient.x, posClient.y ));
-                }
-
-                /* stop tracking mouse hover */
-                TrackingList[i].tme.dwFlags ^= TME_HOVER;
-            }
+    }
+
+    /* see if we are tracking hovering for this hwnd */
+    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.0)) ||
+            (abs(pos.y - tracking_info.pos.y) > (hoverheight / 2.0)))
+        {
+            /* record this new position as the current position and reset */
+            /* the iHoverTime variable to 0 */
+            tracking_info.pos = pos;
         }
-
-        /* see if we are still tracking TME_HOVER or TME_LEAVE for this entry */
-        if((TrackingList[i].tme.dwFlags & TME_HOVER) ||
-           (TrackingList[i].tme.dwFlags & TME_LEAVE)) {
-            i++;
-        } else { /* remove this entry from the tracking list */
-            TrackingList[i] = TrackingList[--iTrackMax];
+        else
+        {
+            posClient.x = pos.x;
+            posClient.y = pos.y;
+            ScreenToClient(hwnd, &posClient);
+
+            if (tracking_info.tme.dwFlags & TME_NONCLIENT)
+                PostMessageW(tracking_info.tme.hwndTrack, WM_NCMOUSEHOVER,
+                            get_key_state(), MAKELPARAM( posClient.x, posClient.y ));
+            else
+                PostMessageW(tracking_info.tme.hwndTrack, WM_MOUSEHOVER,
+                            get_key_state(), MAKELPARAM( posClient.x, posClient.y ));
+
+            /* stop tracking mouse hover */
+            tracking_info.tme.dwFlags &= ~TME_HOVER;
         }
     }
 
     /* stop the timer if the tracking list is empty */
-    if(iTrackMax == 0) {
+    if (!(tracking_info.tme.dwFlags & (TME_HOVER | TME_LEAVE)))
+    {
+        memset(&tracking_info, 0, sizeof(tracking_info));
+
         KillTimer(0, timer);
         timer = 0;
     }
@@ -857,171 +839,77 @@
 TrackMouseEvent(
   LPTRACKMOUSEEVENT ptme)
 {
-    DWORD flags = 0;
-    int i = 0;
-    BOOL cancel = 0, hover = 0, leave = 0, query = 0, nonclient = 0, inclient = 0;
     HWND hwnd;
     POINT pos;
-    RECT client;
-
-
-    pos.x = 0;
-    pos.y = 0;
-    SetRectEmpty(&client);
-
-    DPRINT("%lx, %lx, %p, %lx\n", ptme->cbSize, ptme->dwFlags, ptme->hwndTrack, ptme->dwHoverTime);
+    DWORD hover_time;
+
+    TRACE("%lx, %lx, %p, %lx\n", ptme->cbSize, ptme->dwFlags, ptme->hwndTrack, ptme->dwHoverTime);
 
     if (ptme->cbSize != sizeof(TRACKMOUSEEVENT)) {
-        DPRINT("wrong TRACKMOUSEEVENT size from app\n");
-        SetLastError(ERROR_INVALID_PARAMETER); /* FIXME not sure if this is correct */
+        WARN("wrong TRACKMOUSEEVENT size from app\n");
+        SetLastError(ERROR_INVALID_PARAMETER);
         return FALSE;
     }
 
-    flags = ptme->dwFlags;
+    /* fill the TRACKMOUSEEVENT struct with the current tracking for the given hwnd */
+    if (ptme->dwFlags & TME_QUERY )
+    {
+        *ptme = tracking_info.tme;
+
+        return TRUE; /* return here, TME_QUERY is retrieving information */
+    }
+
+    if (!IsWindow(ptme->hwndTrack))
+    {
+        SetLastError(ERROR_INVALID_WINDOW_HANDLE);
+        return FALSE;
+    }
+
+    hover_time = ptme->dwHoverTime;
 
     /* if HOVER_DEFAULT was specified replace this with the systems current value */
-    if(ptme->dwHoverTime == HOVER_DEFAULT)
-        SystemParametersInfoA(SPI_GETMOUSEHOVERTIME, 0, &(ptme->dwHoverTime), 0);
+    if (hover_time == HOVER_DEFAULT || hover_time == 0)
+//        SystemParametersInfoW(SPI_GETMOUSEHOVERTIME, 0, &hover_time, 0);
+        hover_time = 400;
 
     GetCursorPos(&pos);
     hwnd = WindowFromPoint(pos);
 
-    if ( flags & TME_CANCEL ) {
-        flags &= ~ TME_CANCEL;
-        cancel = 1;
-    }
-
-    if ( flags & TME_HOVER  ) {
-        flags &= ~ TME_HOVER;
-        hover = 1;
-    }
-
-    if ( flags & TME_LEAVE ) {
-        flags &= ~ TME_LEAVE;
-        leave = 1;
-    }
-
-    if ( flags & TME_NONCLIENT ) {
-        flags &= ~ TME_NONCLIENT;
-        nonclient = 1;
-    }
-
-    /* fill the TRACKMOUSEEVENT struct with the current tracking for the given hwnd */
-    if ( flags & TME_QUERY ) {
-        flags &= ~ TME_QUERY;
-        query = 1;
-        i = 0;
-
-        /* Find the tracking list entry with the matching hwnd */
-        while((i < iTrackMax) && (TrackingList[i].tme.hwndTrack != ptme->hwndTrack)) {
-            i++;
-        }
-
-        /* hwnd found, fill in the ptme struct */
-        if(i < iTrackMax)
-            *ptme = TrackingList[i].tme;
-        else
-            ptme->dwFlags = 0;
-
-        return TRUE; /* return here, TME_QUERY is retrieving information */
-    }
-
-    if ( flags )
-        DPRINT("Unknown flag(s) %08lx\n", flags );
-
-    if(cancel) {
-        /* find a matching hwnd if one exists */
-        i = 0;
-
-        while((i < iTrackMax) && (TrackingList[i].tme.hwndTrack != ptme->hwndTrack)) {
-          i++;
-        }
-
-        if(i < iTrackMax) {
-            TrackingList[i].tme.dwFlags &= ~(ptme->dwFlags & ~TME_CANCEL);
+    if (ptme->dwFlags & ~(TME_CANCEL | TME_HOVER | TME_LEAVE | TME_NONCLIENT))
+        FIXME("Unknown flag(s) %08lx\n", ptme->dwFlags & ~(TME_CANCEL | TME_HOVER | TME_LEAVE | TME_NONCLIENT));
+
+    if (ptme->dwFlags & TME_CANCEL)
+    {
+        if (tracking_info.tme.hwndTrack == ptme->hwndTrack)
+        {
+            tracking_info.tme.dwFlags &= ~(ptme->dwFlags & ~TME_CANCEL);
 
             /* if we aren't tracking on hover or leave remove this entry */
-            if(!((TrackingList[i].tme.dwFlags & TME_HOVER) ||
-                 (TrackingList[i].tme.dwFlags & TME_LEAVE)))
+            if (!(tracking_info.tme.dwFlags & (TME_HOVER | TME_LEAVE)))
             {
-                TrackingList[i] = TrackingList[--iTrackMax];
-
-                if(iTrackMax == 0) {
-                    KillTimer(0, timer);
-                    timer = 0;
-                }
+                memset(&tracking_info, 0, sizeof(tracking_info));
+
+                KillTimer(0, timer);
+                timer = 0;
             }
         }
     } else {
-        /* see if hwndTrack isn't the current window */
-        if(ptme->hwndTrack != hwnd) {
-            if(leave) {
-                if(nonclient) {
-                    PostMessageA(ptme->hwndTrack, WM_NCMOUSELEAVE, 0, 0);
-                }
-                else {
-                    PostMessageA(ptme->hwndTrack, WM_MOUSELEAVE, 0, 0);
-                }
-            }
-        } else {
-            GetClientRect(ptme->hwndTrack, &client);
-            MapWindowPoints(ptme->hwndTrack, NULL, (LPPOINT)&client, 2);
-            if(PtInRect(&client, pos)) {
-                inclient = 1;
-            }
-            if(nonclient && inclient) {
-                PostMessageA(ptme->hwndTrack, WM_NCMOUSELEAVE, 0, 0);
-                return TRUE;
-            }
-            else if(!nonclient && !inclient) {
-                PostMessageA(ptme->hwndTrack, WM_MOUSELEAVE, 0, 0);
-                return TRUE;
-            }
-
-            /* See if this hwnd is already being tracked and update the tracking flags */
-            for(i = 0; i < iTrackMax; i++) {
-                if(TrackingList[i].tme.hwndTrack == ptme->hwndTrack) {
-                    TrackingList[i].tme.dwFlags = 0;
-
-                    if(hover) {
-                        TrackingList[i].tme.dwFlags |= TME_HOVER;
-                        TrackingList[i].tme.dwHoverTime = ptme->dwHoverTime;
-                    }
-
-                    if(leave)
-                        TrackingList[i].tme.dwFlags |= TME_LEAVE;
-
-                    if(nonclient)
-                        TrackingList[i].tme.dwFlags |= TME_NONCLIENT;
-
-                    /* reset iHoverTime as per winapi specs */
-                    TrackingList[i].iHoverTime = 0;
-
-                    return TRUE;
-                }
-            }
-
-            /* if the tracking list is full return FALSE */
-            if (iTrackMax == sizeof (TrackingList) / sizeof(*TrackingList)) {
-                return FALSE;
-            }
-
+        if (ptme->hwndTrack == hwnd)
+        {
             /* Adding new mouse event to the tracking list */
-            TrackingList[iTrackMax].tme = *ptme;
+            tracking_info.tme = *ptme;
+            tracking_info.tme.dwHoverTime = hover_time;
 
             /* Initialize HoverInfo variables even if not hover tracking */
-            TrackingList[iTrackMax].iHoverTime = 0;
-            TrackingList[iTrackMax].pos = pos;
-
-            iTrackMax++;
-
-            if (!timer) {
-                timer = SetTimer(0, 0, iTimerInterval, TrackMouseEventProc);
-            }
+            tracking_info.pos = pos;
+
+            if (!timer)
+                timer = SetTimer(0, 0, hover_time, TrackMouseEventProc);
         }
     }
 
     return TRUE;
+ 
 }
 
 /* EOF */

Modified: branches/ros-branch-0_3_0/reactos/dll/win32/user32/windows/message.c
URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_0/reactos/dll/win32/user32/windows/message.c?rev=23387&r1=23386&r2=23387&view=diff
==============================================================================
--- branches/ros-branch-0_3_0/reactos/dll/win32/user32/windows/message.c (original)
+++ branches/ros-branch-0_3_0/reactos/dll/win32/user32/windows/message.c Mon Jul 31 09:44:22 2006
@@ -9,8 +9,8 @@
  */
 
 #include <user32.h>
-#define NDEBUG
-#include <debug.h>
+
+#include <wine/debug.h>
 
 /* DDE message exchange
  *
@@ -1141,6 +1141,12 @@
   MSG UnicodeMsg;
   LRESULT Result;
 
+  if (WndProc == NULL)
+  {
+      DPRINT1("IntCallWindowsProcW() called with WndProc = NULL!\n");
+      return FALSE;
+  }
+
   if (IsAnsiProc)
     {
       UnicodeMsg.hwnd = hWnd;
@@ -1176,6 +1182,12 @@
   MSG AnsiMsg;
   MSG UnicodeMsg;
   LRESULT Result;
+
+  if (WndProc == NULL)
+  {
+      DPRINT1("IntCallWindowsProcA() called with WndProc = NULL!\n");
+      return FALSE;
+  }
 
   if (IsAnsiProc)
     {




More information about the Ros-diffs mailing list