[PATCH 4/8] ole32: Move DragEnter handling to a separate function.

Huw Davies huw at codeweavers.com
Tue Feb 23 04:09:30 CST 2016


Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/ole32/ole2.c | 77 ++++++++++++++++++++++---------------------------------
 1 file changed, 31 insertions(+), 46 deletions(-)

diff --git a/dlls/ole32/ole2.c b/dlls/ole32/ole2.c
index 39cb57b..fdfe16f 100644
--- a/dlls/ole32/ole2.c
+++ b/dlls/ole32/ole2.c
@@ -2182,6 +2182,35 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
   return DefWindowProcW (hwnd, uMsg, wParam, lParam);
 }
 
+static void drag_enter( TrackerWindowInfo *info, HWND new_target )
+{
+    HRESULT hr;
+
+    info->curTargetHWND = new_target;
+
+    while (new_target && !is_droptarget( new_target ))
+        new_target = GetParent( new_target );
+
+    info->curDragTarget = get_droptarget_pointer( new_target );
+
+    if (info->curDragTarget)
+    {
+        *info->pdwEffect = info->dwOKEffect;
+        hr = IDropTarget_DragEnter( info->curDragTarget, info->dataObject,
+                                    info->dwKeyState, info->curMousePos,
+                                    info->pdwEffect );
+        *info->pdwEffect &= info->dwOKEffect;
+
+        /* failed DragEnter() means invalid target */
+        if (hr != S_OK)
+        {
+            IDropTarget_Release( info->curDragTarget );
+            info->curDragTarget = NULL;
+            info->curTargetHWND = NULL;
+        }
+    }
+}
+
 static HRESULT give_feedback( TrackerWindowInfo *info )
 {
     HRESULT hr;
@@ -2237,13 +2266,6 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
   trackerInfo->returnValue = IDropSource_QueryContinueDrag(trackerInfo->dropSource,
                                                            trackerInfo->escPressed,
                                                            trackerInfo->dwKeyState);
-
-  /*
-   * Every time, we re-initialize the effects passed to the
-   * IDropTarget to the effects allowed by the source.
-   */
-  *trackerInfo->pdwEffect = trackerInfo->dwOKEffect;
-
   /*
    * If we are hovering over the same target as before, send the
    * DragOver notification
@@ -2251,6 +2273,7 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
   if ( (trackerInfo->curDragTarget != 0) &&
        (trackerInfo->curTargetHWND == hwndNewTarget) )
   {
+    *trackerInfo->pdwEffect = trackerInfo->dwOKEffect;
     IDropTarget_DragOver(trackerInfo->curDragTarget,
                          trackerInfo->dwKeyState,
                          trackerInfo->curMousePos,
@@ -2271,46 +2294,8 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
       trackerInfo->curTargetHWND = NULL;
     }
 
-    /*
-     * Make sure we're hovering over a window.
-     */
     if (hwndNewTarget)
-    {
-      /*
-       * Find-out if there is a drag target under the mouse
-       */
-      HWND next_target_wnd = hwndNewTarget;
-
-      trackerInfo->curTargetHWND = hwndNewTarget;
-
-      while (next_target_wnd && !is_droptarget(next_target_wnd))
-          next_target_wnd = GetParent(next_target_wnd);
-
-      if (next_target_wnd) hwndNewTarget = next_target_wnd;
-
-      trackerInfo->curDragTarget     = get_droptarget_pointer(hwndNewTarget);
-
-      /*
-       * If there is, notify it that we just dragged-in
-       */
-      if (trackerInfo->curDragTarget)
-      {
-        hr = IDropTarget_DragEnter(trackerInfo->curDragTarget,
-                                   trackerInfo->dataObject,
-                                   trackerInfo->dwKeyState,
-                                   trackerInfo->curMousePos,
-                                   trackerInfo->pdwEffect);
-        *trackerInfo->pdwEffect &= trackerInfo->dwOKEffect;
-
-        /* failed DragEnter() means invalid target */
-        if (hr != S_OK)
-        {
-          trackerInfo->curTargetHWND     = 0;
-          IDropTarget_Release(trackerInfo->curDragTarget);
-          trackerInfo->curDragTarget     = 0;
-        }
-      }
-    }
+      drag_enter( trackerInfo, hwndNewTarget );
   }
 
   give_feedback( trackerInfo );
-- 
2.7.0




More information about the wine-patches mailing list