[WIN32K] Check if the window being destroyed is currently tracked. (#103)
authorMark Jansen <mark.jansen@reactos.org>
Sat, 4 Nov 2017 14:00:54 +0000 (15:00 +0100)
committerGitHub <noreply@github.com>
Sat, 4 Nov 2017 14:00:54 +0000 (15:00 +0100)
* [WIN32K] Check if the window being destroyed is currently tracked.
CORE-13619

win32ss/user/ntuser/mouse.c
win32ss/user/ntuser/window.c

index fc3827e..46dfcfd 100644 (file)
@@ -342,6 +342,26 @@ UserSendMouseInput(MOUSEINPUT *pmi, BOOL bInjected)
     return TRUE;
 }
 
+VOID
+FASTCALL
+IntRemoveTrackMouseEvent(
+    PDESKTOP pDesk)
+{
+    /* Generate a leave message */
+    if (pDesk->dwDTFlags & DF_TME_LEAVE)
+    {
+        UINT uMsg = (pDesk->htEx != HTCLIENT) ? WM_NCMOUSELEAVE : WM_MOUSELEAVE;
+        UserPostMessage(UserHMGetHandle(pDesk->spwndTrack), uMsg, 0, 0);
+    }
+    /* Kill the timer */
+    if (pDesk->dwDTFlags & DF_TME_HOVER)
+        IntKillTimer(pDesk->spwndTrack, ID_EVENT_SYSTIMER_MOUSEHOVER, TRUE);
+
+    /* Reset state */
+    pDesk->dwDTFlags &= ~(DF_TME_LEAVE|DF_TME_HOVER);
+    pDesk->spwndTrack = NULL;
+}
+
 BOOL
 FASTCALL
 IntQueryTrackMouseEvent(
index b8a3b59..9c7627c 100644 (file)
@@ -381,6 +381,12 @@ DWORD FASTCALL IntGetWindowContextHelpId( PWND pWnd )
    return HelpId;
 }
 
+
+VOID
+FASTCALL
+IntRemoveTrackMouseEvent(
+    PDESKTOP pDesk);
+
 /***********************************************************************
  *           IntSendDestroyMsg
  */
@@ -422,6 +428,12 @@ static void IntSendDestroyMsg(HWND hWnd)
       {
          co_IntDestroyCaret(ti);
       }
+
+      /* If the window being destroyed is currently tracked... */
+      if (ti->rpdesk->spwndTrack == Window)
+      {
+          IntRemoveTrackMouseEvent(ti->rpdesk);
+      }
    }
 
    /* If the window being destroyed is the current clipboard owner... */