Michael Jung : ole32: Periodically call IDropTarger::DragOver during Drag&Drop.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 12 06:45:10 CST 2005


Module: wine
Branch: refs/heads/master
Commit: 892fc1093d3b7994570938da01554c988fe3e437
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=892fc1093d3b7994570938da01554c988fe3e437

Author: Michael Jung <mjung at iss.tu-darmstadt.de>
Date:   Mon Dec 12 12:42:53 2005 +0100

ole32: Periodically call IDropTarger::DragOver during Drag&Drop.

---

 dlls/ole32/ole2.c |  129 ++++++++++++++---------------------------------------
 1 files changed, 34 insertions(+), 95 deletions(-)

diff --git a/dlls/ole32/ole2.c b/dlls/ole32/ole2.c
index 4bc815e..fd55930 100644
--- a/dlls/ole32/ole2.c
+++ b/dlls/ole32/ole2.c
@@ -79,6 +79,8 @@ typedef struct tagTrackerWindowInfo
   HWND       curTargetHWND;	/* window the mouse is hovering over */
   HWND       curDragTargetHWND; /* might be a ancestor of curTargetHWND */
   IDropTarget* curDragTarget;
+  POINTL     curMousePos;       /* current position of the mouse in screen coordinates */
+  DWORD      dwKeyState;        /* current state of the shift and ctrl keys and the mouse buttons */
 } TrackerWindowInfo;
 
 typedef struct tagOleMenuDescriptor  /* OleMenuDescriptor */
@@ -158,13 +160,9 @@ static LRESULT WINAPI  OLEDD_DragTracker
 			 WPARAM wParam,
 			 LPARAM   lParam);
 static void OLEDD_TrackMouseMove(
-                         TrackerWindowInfo* trackerInfo,
-			 POINT            mousePos,
-			 DWORD              keyState);
+                         TrackerWindowInfo* trackerInfo);
 static void OLEDD_TrackStateChange(
-                         TrackerWindowInfo* trackerInfo,
-			 POINT            mousePos,
-			 DWORD              keyState);
+                         TrackerWindowInfo* trackerInfo);
 static DWORD OLEDD_GetButtonState(void);
 
 
@@ -533,6 +531,10 @@ HRESULT WINAPI DoDragDrop (
      */
     while (!trackerInfo.trackingDone && GetMessageA(&msg, 0, 0, 0) )
     {
+      trackerInfo.curMousePos.x = msg.pt.x;
+      trackerInfo.curMousePos.y = msg.pt.y;
+      trackerInfo.dwKeyState = OLEDD_GetButtonState();
+	    
       if ( (msg.message >= WM_KEYFIRST) &&
 	   (msg.message <= WM_KEYLAST) )
       {
@@ -551,9 +553,7 @@ HRESULT WINAPI DoDragDrop (
 	/*
 	 * Notify the drop source.
 	 */
-	OLEDD_TrackStateChange(&trackerInfo,
-			       msg.pt,
-			       OLEDD_GetButtonState());
+        OLEDD_TrackStateChange(&trackerInfo);
       }
       else
       {
@@ -2033,6 +2033,9 @@ static DropTargetNode* OLEDD_FindDropTar
  * to receive the user input and act upon it. This procedure is in charge
  * of this behavior.
  */
+
+#define DRAG_TIMER_ID 1
+
 static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
 			 HWND   hwnd,
 			 UINT   uMsg,
@@ -2046,27 +2049,14 @@ static LRESULT WINAPI OLEDD_DragTrackerW
       LPCREATESTRUCTA createStruct = (LPCREATESTRUCTA)lParam;
 
       SetWindowLongA(hwnd, 0, (LONG)createStruct->lpCreateParams);
-
+      SetTimer(hwnd, DRAG_TIMER_ID, 50, NULL);
 
       break;
     }
+    case WM_TIMER:
     case WM_MOUSEMOVE:
     {
-      TrackerWindowInfo* trackerInfo = (TrackerWindowInfo*)GetWindowLongA(hwnd, 0);
-      POINT            mousePos;
-
-      /*
-       * Get the current mouse position in screen coordinates.
-       */
-      mousePos.x = LOWORD(lParam);
-      mousePos.y = HIWORD(lParam);
-      ClientToScreen(hwnd, &mousePos);
-
-      /*
-       * Track the movement of the mouse.
-       */
-      OLEDD_TrackMouseMove(trackerInfo, mousePos, wParam);
-
+      OLEDD_TrackMouseMove((TrackerWindowInfo*)GetWindowLongA(hwnd, 0));
       break;
     }
     case WM_LBUTTONUP:
@@ -2076,22 +2066,12 @@ static LRESULT WINAPI OLEDD_DragTrackerW
     case WM_MBUTTONDOWN:
     case WM_RBUTTONDOWN:
     {
-      TrackerWindowInfo* trackerInfo = (TrackerWindowInfo*)GetWindowLongA(hwnd, 0);
-      POINT            mousePos;
-
-      /*
-       * Get the current mouse position in screen coordinates.
-       */
-      mousePos.x = LOWORD(lParam);
-      mousePos.y = HIWORD(lParam);
-      ClientToScreen(hwnd, &mousePos);
-
-      /*
-       * Notify everyone that the button state changed
-       * TODO: Check if the "escape" key was pressed.
-       */
-      OLEDD_TrackStateChange(trackerInfo, mousePos, wParam);
-
+      OLEDD_TrackStateChange((TrackerWindowInfo*)GetWindowLongA(hwnd, 0));
+      break;
+    }
+    case WM_DESTROY:
+    {
+      KillTimer(hwnd, DRAG_TIMER_ID);
       break;
     }
   }
@@ -2114,23 +2094,19 @@ static LRESULT WINAPI OLEDD_DragTrackerW
  *    trackerInfo - Pointer to the structure identifying the
  *                  drag & drop operation that is currently
  *                  active.
- *    mousePos    - Current position of the mouse in screen
- *                  coordinates.
- *    keyState    - Contains the state of the shift keys and the
- *                  mouse buttons (MK_LBUTTON and the like)
  */
-static void OLEDD_TrackMouseMove(
-  TrackerWindowInfo* trackerInfo,
-  POINT            mousePos,
-  DWORD              keyState)
+static void OLEDD_TrackMouseMove(TrackerWindowInfo* trackerInfo)
 {
   HWND   hwndNewTarget = 0;
   HRESULT  hr = S_OK;
+  POINT pt;
 
   /*
    * Get the handle of the window under the mouse
    */
-  hwndNewTarget = WindowFromPoint(mousePos);
+  pt.x = trackerInfo->curMousePos.x;
+  pt.y = trackerInfo->curMousePos.y;
+  hwndNewTarget = WindowFromPoint(pt);
 
   /*
    * Every time, we re-initialize the effects passed to the
@@ -2145,19 +2121,9 @@ static void OLEDD_TrackMouseMove(
   if ( (trackerInfo->curDragTarget != 0) &&
        (trackerInfo->curTargetHWND == hwndNewTarget) )
   {
-    POINTL  mousePosParam;
-
-    /*
-     * The documentation tells me that the coordinate should be in the target
-     * window's coordinate space. However, the tests I made tell me the
-     * coordinates should be in screen coordinates.
-     */
-    mousePosParam.x = mousePos.x;
-    mousePosParam.y = mousePos.y;
-
     IDropTarget_DragOver(trackerInfo->curDragTarget,
-			 keyState,
-			 mousePosParam,
+                         trackerInfo->dwKeyState,
+                         trackerInfo->curMousePos,
 			 trackerInfo->pdwEffect);
   }
   else
@@ -2197,20 +2163,10 @@ static void OLEDD_TrackMouseMove(
        */
       if (trackerInfo->curDragTarget!=0)
       {
-	POINTL  mousePosParam;
-
-	/*
-	 * The documentation tells me that the coordinate should be in the target
-	 * window's coordinate space. However, the tests I made tell me the
-	 * coordinates should be in screen coordinates.
-	 */
-	mousePosParam.x = mousePos.x;
-	mousePosParam.y = mousePos.y;
-
 	IDropTarget_DragEnter(trackerInfo->curDragTarget,
 			      trackerInfo->dataObject,
-			      keyState,
-			      mousePosParam,
+                              trackerInfo->dwKeyState,
+                              trackerInfo->curMousePos,
 			      trackerInfo->pdwEffect);
       }
     }
@@ -2276,15 +2232,8 @@ static void OLEDD_TrackMouseMove(
  *    trackerInfo - Pointer to the structure identifying the
  *                  drag & drop operation that is currently
  *                  active.
- *    mousePos    - Current position of the mouse in screen
- *                  coordinates.
- *    keyState    - Contains the state of the shift keys and the
- *                  mouse buttons (MK_LBUTTON and the like)
  */
-static void OLEDD_TrackStateChange(
-  TrackerWindowInfo* trackerInfo,
-  POINT            mousePos,
-  DWORD              keyState)
+static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
 {
   /*
    * Ask the drop source what to do with the operation.
@@ -2292,7 +2241,7 @@ static void OLEDD_TrackStateChange(
   trackerInfo->returnValue = IDropSource_QueryContinueDrag(
 			       trackerInfo->dropSource,
 			       trackerInfo->escPressed,
-			       keyState);
+                               trackerInfo->dwKeyState);
 
   /*
    * All the return valued will stop the operation except the S_OK
@@ -2325,20 +2274,10 @@ static void OLEDD_TrackStateChange(
 	 */
         case DRAGDROP_S_DROP:
 	{
-	  POINTL  mousePosParam;
-
-	  /*
-	   * The documentation tells me that the coordinate should be
-	   * in the target window's coordinate space. However, the tests
-	   * I made tell me the coordinates should be in screen coordinates.
-	   */
-	  mousePosParam.x = mousePos.x;
-	  mousePosParam.y = mousePos.y;
-
 	  IDropTarget_Drop(trackerInfo->curDragTarget,
 			   trackerInfo->dataObject,
-			   keyState,
-			   mousePosParam,
+                           trackerInfo->dwKeyState,
+                           trackerInfo->curMousePos,
 			   trackerInfo->pdwEffect);
 	  break;
 	}




More information about the wine-cvs mailing list