QT_ENSURE_STACK_ALIGNED_FOR_SSE STDMETHODIMP QWindowsOleDropSource::GiveFeedback(DWORD dwEffect) { const Qt::DropAction action = translateToQDragDropAction(dwEffect); m_drag->updateAction(action); const qint64 currentCacheKey = m_drag->currentDrag()->dragCursor(action).cacheKey(); auto it = m_cursors.constFind(action); // If a custom drag cursor is set, check its cache key to detect changes. if (it == m_cursors.constEnd() || (currentCacheKey && currentCacheKey != it.value().cacheKey)) { createCursors(); it = m_cursors.constFind(action); } if (it != m_cursors.constEnd()) { const CursorEntry &e = it.value(); switch (m_mode) { case MouseDrag: SetCursor(e.cursor->handle()); break; case TouchDrag: if (!m_touchDragWindow) m_touchDragWindow = new QWindowsDragCursorWindow; m_touchDragWindow->setPixmap(e.pixmap); m_touchDragWindow->setFramePosition(QCursor::pos() - e.hotSpot); if (!m_touchDragWindow->isVisible()) m_touchDragWindow->show(); break; } return ResultFromScode(S_OK); } return ResultFromScode(DRAGDROP_S_USEDEFAULTCURSORS); }
void QWindowsOleDropSource::clearCursors() { if (!m_cursors.isEmpty()) { const ActionCursorMap::const_iterator cend = m_cursors.constEnd(); for (ActionCursorMap::const_iterator it = m_cursors.constBegin(); it != cend; ++it) DestroyCursor(it.value()); m_cursors.clear(); } }