mirror of
https://github.com/reactos/wine.git
synced 2024-11-25 12:49:45 +00:00
ole32: Periodically call IDropTarger::DragOver during Drag&Drop.
This commit is contained in:
parent
681b71ed9a
commit
892fc1093d
@ -79,6 +79,8 @@ typedef struct tagTrackerWindowInfo
|
|||||||
HWND curTargetHWND; /* window the mouse is hovering over */
|
HWND curTargetHWND; /* window the mouse is hovering over */
|
||||||
HWND curDragTargetHWND; /* might be a ancestor of curTargetHWND */
|
HWND curDragTargetHWND; /* might be a ancestor of curTargetHWND */
|
||||||
IDropTarget* curDragTarget;
|
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;
|
} TrackerWindowInfo;
|
||||||
|
|
||||||
typedef struct tagOleMenuDescriptor /* OleMenuDescriptor */
|
typedef struct tagOleMenuDescriptor /* OleMenuDescriptor */
|
||||||
@ -158,13 +160,9 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
|
|||||||
WPARAM wParam,
|
WPARAM wParam,
|
||||||
LPARAM lParam);
|
LPARAM lParam);
|
||||||
static void OLEDD_TrackMouseMove(
|
static void OLEDD_TrackMouseMove(
|
||||||
TrackerWindowInfo* trackerInfo,
|
TrackerWindowInfo* trackerInfo);
|
||||||
POINT mousePos,
|
|
||||||
DWORD keyState);
|
|
||||||
static void OLEDD_TrackStateChange(
|
static void OLEDD_TrackStateChange(
|
||||||
TrackerWindowInfo* trackerInfo,
|
TrackerWindowInfo* trackerInfo);
|
||||||
POINT mousePos,
|
|
||||||
DWORD keyState);
|
|
||||||
static DWORD OLEDD_GetButtonState(void);
|
static DWORD OLEDD_GetButtonState(void);
|
||||||
|
|
||||||
|
|
||||||
@ -533,6 +531,10 @@ HRESULT WINAPI DoDragDrop (
|
|||||||
*/
|
*/
|
||||||
while (!trackerInfo.trackingDone && GetMessageA(&msg, 0, 0, 0) )
|
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) &&
|
if ( (msg.message >= WM_KEYFIRST) &&
|
||||||
(msg.message <= WM_KEYLAST) )
|
(msg.message <= WM_KEYLAST) )
|
||||||
{
|
{
|
||||||
@ -551,9 +553,7 @@ HRESULT WINAPI DoDragDrop (
|
|||||||
/*
|
/*
|
||||||
* Notify the drop source.
|
* Notify the drop source.
|
||||||
*/
|
*/
|
||||||
OLEDD_TrackStateChange(&trackerInfo,
|
OLEDD_TrackStateChange(&trackerInfo);
|
||||||
msg.pt,
|
|
||||||
OLEDD_GetButtonState());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2033,6 +2033,9 @@ static DropTargetNode* OLEDD_FindDropTarget(HWND hwndOfTarget)
|
|||||||
* to receive the user input and act upon it. This procedure is in charge
|
* to receive the user input and act upon it. This procedure is in charge
|
||||||
* of this behavior.
|
* of this behavior.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define DRAG_TIMER_ID 1
|
||||||
|
|
||||||
static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
|
static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
|
||||||
HWND hwnd,
|
HWND hwnd,
|
||||||
UINT uMsg,
|
UINT uMsg,
|
||||||
@ -2046,27 +2049,14 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
|
|||||||
LPCREATESTRUCTA createStruct = (LPCREATESTRUCTA)lParam;
|
LPCREATESTRUCTA createStruct = (LPCREATESTRUCTA)lParam;
|
||||||
|
|
||||||
SetWindowLongA(hwnd, 0, (LONG)createStruct->lpCreateParams);
|
SetWindowLongA(hwnd, 0, (LONG)createStruct->lpCreateParams);
|
||||||
|
SetTimer(hwnd, DRAG_TIMER_ID, 50, NULL);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case WM_TIMER:
|
||||||
case WM_MOUSEMOVE:
|
case WM_MOUSEMOVE:
|
||||||
{
|
{
|
||||||
TrackerWindowInfo* trackerInfo = (TrackerWindowInfo*)GetWindowLongA(hwnd, 0);
|
OLEDD_TrackMouseMove((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);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
@ -2076,22 +2066,12 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
|
|||||||
case WM_MBUTTONDOWN:
|
case WM_MBUTTONDOWN:
|
||||||
case WM_RBUTTONDOWN:
|
case WM_RBUTTONDOWN:
|
||||||
{
|
{
|
||||||
TrackerWindowInfo* trackerInfo = (TrackerWindowInfo*)GetWindowLongA(hwnd, 0);
|
OLEDD_TrackStateChange((TrackerWindowInfo*)GetWindowLongA(hwnd, 0));
|
||||||
POINT mousePos;
|
break;
|
||||||
|
}
|
||||||
/*
|
case WM_DESTROY:
|
||||||
* Get the current mouse position in screen coordinates.
|
{
|
||||||
*/
|
KillTimer(hwnd, DRAG_TIMER_ID);
|
||||||
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);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2114,23 +2094,19 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
|
|||||||
* trackerInfo - Pointer to the structure identifying the
|
* trackerInfo - Pointer to the structure identifying the
|
||||||
* drag & drop operation that is currently
|
* drag & drop operation that is currently
|
||||||
* active.
|
* 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(
|
static void OLEDD_TrackMouseMove(TrackerWindowInfo* trackerInfo)
|
||||||
TrackerWindowInfo* trackerInfo,
|
|
||||||
POINT mousePos,
|
|
||||||
DWORD keyState)
|
|
||||||
{
|
{
|
||||||
HWND hwndNewTarget = 0;
|
HWND hwndNewTarget = 0;
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
|
POINT pt;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the handle of the window under the mouse
|
* 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
|
* Every time, we re-initialize the effects passed to the
|
||||||
@ -2145,19 +2121,9 @@ static void OLEDD_TrackMouseMove(
|
|||||||
if ( (trackerInfo->curDragTarget != 0) &&
|
if ( (trackerInfo->curDragTarget != 0) &&
|
||||||
(trackerInfo->curTargetHWND == hwndNewTarget) )
|
(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,
|
IDropTarget_DragOver(trackerInfo->curDragTarget,
|
||||||
keyState,
|
trackerInfo->dwKeyState,
|
||||||
mousePosParam,
|
trackerInfo->curMousePos,
|
||||||
trackerInfo->pdwEffect);
|
trackerInfo->pdwEffect);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2197,20 +2163,10 @@ static void OLEDD_TrackMouseMove(
|
|||||||
*/
|
*/
|
||||||
if (trackerInfo->curDragTarget!=0)
|
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,
|
IDropTarget_DragEnter(trackerInfo->curDragTarget,
|
||||||
trackerInfo->dataObject,
|
trackerInfo->dataObject,
|
||||||
keyState,
|
trackerInfo->dwKeyState,
|
||||||
mousePosParam,
|
trackerInfo->curMousePos,
|
||||||
trackerInfo->pdwEffect);
|
trackerInfo->pdwEffect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2276,15 +2232,8 @@ static void OLEDD_TrackMouseMove(
|
|||||||
* trackerInfo - Pointer to the structure identifying the
|
* trackerInfo - Pointer to the structure identifying the
|
||||||
* drag & drop operation that is currently
|
* drag & drop operation that is currently
|
||||||
* active.
|
* 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(
|
static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
|
||||||
TrackerWindowInfo* trackerInfo,
|
|
||||||
POINT mousePos,
|
|
||||||
DWORD keyState)
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Ask the drop source what to do with the operation.
|
* Ask the drop source what to do with the operation.
|
||||||
@ -2292,7 +2241,7 @@ static void OLEDD_TrackStateChange(
|
|||||||
trackerInfo->returnValue = IDropSource_QueryContinueDrag(
|
trackerInfo->returnValue = IDropSource_QueryContinueDrag(
|
||||||
trackerInfo->dropSource,
|
trackerInfo->dropSource,
|
||||||
trackerInfo->escPressed,
|
trackerInfo->escPressed,
|
||||||
keyState);
|
trackerInfo->dwKeyState);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* All the return valued will stop the operation except the S_OK
|
* All the return valued will stop the operation except the S_OK
|
||||||
@ -2325,20 +2274,10 @@ static void OLEDD_TrackStateChange(
|
|||||||
*/
|
*/
|
||||||
case DRAGDROP_S_DROP:
|
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,
|
IDropTarget_Drop(trackerInfo->curDragTarget,
|
||||||
trackerInfo->dataObject,
|
trackerInfo->dataObject,
|
||||||
keyState,
|
trackerInfo->dwKeyState,
|
||||||
mousePosParam,
|
trackerInfo->curMousePos,
|
||||||
trackerInfo->pdwEffect);
|
trackerInfo->pdwEffect);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user