Windows: Post drag events for the window on which the drop site was registered.

Remove findDragOverWindow(); no longer try to find the window under cursor
since that would require synthesizing drag leave events. This is left to the
DnD handling of QWidgetWindow, which searches the child which accepts drops.

Task-number: QTBUG-33635

Change-Id: I844041bb862bb0382147be4e28f880a26843c453
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
bb10
Friedemann Kleint 2014-02-03 16:52:46 +01:00 committed by The Qt Project
parent 4072d68f57
commit 9e6bb60131
2 changed files with 6 additions and 18 deletions

View File

@ -673,14 +673,6 @@ QWindowsOleDropTarget::Release(void)
return m_refs;
}
QWindow *QWindowsOleDropTarget::findDragOverWindow(const POINTL &pt) const
{
if (QWindowsWindow *child =
QWindowsWindow::baseWindowOf(m_window)->childAtScreenPoint(QPoint(pt.x, pt.y)))
return child->window();
return m_window;
}
void QWindowsOleDropTarget::handleDrag(QWindow *window, DWORD grfKeyState,
const QPoint &point, LPDWORD pdwEffect)
{
@ -735,10 +727,9 @@ QWindowsOleDropTarget::DragOver(DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect)
if (IDropTargetHelper* dh = QWindowsDrag::instance()->dropHelper())
dh->DragOver(reinterpret_cast<POINT*>(&pt), *pdwEffect);
QWindow *dragOverWindow = findDragOverWindow(pt);
qCDebug(lcQpaMime) << __FUNCTION__ << "widget=" << dragOverWindow << " key=" << grfKeyState
qCDebug(lcQpaMime) << __FUNCTION__ << "m_window" << m_window << "key=" << grfKeyState
<< "pt=" << pt.x << pt.y;
const QPoint tmpPoint = QWindowsGeometryHint::mapFromGlobal(dragOverWindow, QPoint(pt.x,pt.y));
const QPoint tmpPoint = QWindowsGeometryHint::mapFromGlobal(m_window, QPoint(pt.x,pt.y));
// see if we should compress this event
if ((tmpPoint == m_lastPoint || m_answerRect.contains(tmpPoint))
&& m_lastKeyState == grfKeyState) {
@ -747,7 +738,7 @@ QWindowsOleDropTarget::DragOver(DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect)
return NOERROR;
}
handleDrag(dragOverWindow, grfKeyState, tmpPoint, pdwEffect);
handleDrag(m_window, grfKeyState, tmpPoint, pdwEffect);
return NOERROR;
}
@ -774,12 +765,10 @@ QWindowsOleDropTarget::Drop(LPDATAOBJECT pDataObj, DWORD grfKeyState,
if (IDropTargetHelper* dh = QWindowsDrag::instance()->dropHelper())
dh->Drop(pDataObj, reinterpret_cast<POINT*>(&pt), *pdwEffect);
QWindow *dropWindow = findDragOverWindow(pt);
qCDebug(lcQpaMime) << __FUNCTION__ << ' ' << m_window
<< " on " << dropWindow << " keys=" << grfKeyState << " pt=" << pt.x << ',' << pt.y;
<< "keys=" << grfKeyState << "pt=" << pt.x << ',' << pt.y;
m_lastPoint = QWindowsGeometryHint::mapFromGlobal(dropWindow, QPoint(pt.x,pt.y));
m_lastPoint = QWindowsGeometryHint::mapFromGlobal(m_window, QPoint(pt.x,pt.y));
// grfKeyState does not all ways contain button state in the drop so if
// it doesn't then use the last known button state;
if ((grfKeyState & KEY_STATE_BUTTON_MASK) == 0)
@ -789,7 +778,7 @@ QWindowsOleDropTarget::Drop(LPDATAOBJECT pDataObj, DWORD grfKeyState,
QWindowsDrag *windowsDrag = QWindowsDrag::instance();
const QPlatformDropQtResponse response =
QWindowSystemInterface::handleDrop(dropWindow, windowsDrag->dropData(), m_lastPoint,
QWindowSystemInterface::handleDrop(m_window, windowsDrag->dropData(), m_lastPoint,
translateToQDragDropActions(*pdwEffect));
if (response.isAccepted()) {

View File

@ -74,7 +74,6 @@ public:
STDMETHOD(Drop)(LPDATAOBJECT pDataObj, DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect);
private:
inline QWindow *findDragOverWindow(const POINTL &pt) const;
void handleDrag(QWindow *window, DWORD grfKeyState, const QPoint &, LPDWORD pdwEffect);
ULONG m_refs;