Windows QPA: Use new QPA Dnd API

Task-number: QTBUG-57168
Task-number: QTBUG-56244
Change-Id: I84cf811d9e886369a659ecb33ce1778207660922
Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
This commit is contained in:
Friedemann Kleint 2018-04-24 12:59:29 +02:00
parent cf63b0e1df
commit 2d1ac61d95

View File

@ -401,11 +401,8 @@ QWindowsOleDropSource::QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState)
switch (result) { switch (result) {
case DRAGDROP_S_DROP: case DRAGDROP_S_DROP:
case DRAGDROP_S_CANCEL: case DRAGDROP_S_CANCEL:
QGuiApplicationPrivate::modifier_buttons = toQtKeyboardModifiers(grfKeyState); if (!m_windowUnderMouse.isNull() && m_mode != TouchDrag && fEscapePressed == FALSE
if (buttons != QGuiApplicationPrivate::mouse_buttons) { && buttons != QGuiApplicationPrivate::mouse_buttons) {
if (m_windowUnderMouse.isNull() || m_mode == TouchDrag || fEscapePressed == TRUE) {
QGuiApplicationPrivate::mouse_buttons = buttons;
} else {
// QTBUG 66447: Synthesize a mouse release to the window under mouse at // QTBUG 66447: Synthesize a mouse release to the window under mouse at
// start of the DnD operation as Windows does not send any. // start of the DnD operation as Windows does not send any.
const QPoint globalPos = QWindowsCursor::mousePosition(); const QPoint globalPos = QWindowsCursor::mousePosition();
@ -415,7 +412,6 @@ QWindowsOleDropSource::QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState)
QWindowsMouseHandler::queryMouseButtons(), QWindowsMouseHandler::queryMouseButtons(),
Qt::LeftButton, QEvent::MouseButtonRelease); Qt::LeftButton, QEvent::MouseButtonRelease);
} }
}
m_currentButtons = Qt::NoButton; m_currentButtons = Qt::NoButton;
break; break;
@ -506,11 +502,13 @@ void QWindowsOleDropTarget::handleDrag(QWindow *window, DWORD grfKeyState,
QWindowsDrag *windowsDrag = QWindowsDrag::instance(); QWindowsDrag *windowsDrag = QWindowsDrag::instance();
const Qt::DropActions actions = translateToQDragDropActions(*pdwEffect); const Qt::DropActions actions = translateToQDragDropActions(*pdwEffect);
QGuiApplicationPrivate::modifier_buttons = toQtKeyboardModifiers(grfKeyState); const Qt::KeyboardModifiers keyboardModifiers = toQtKeyboardModifiers(grfKeyState);
QGuiApplicationPrivate::mouse_buttons = toQtMouseButtons(grfKeyState); const Qt::MouseButtons mouseButtons = toQtMouseButtons(grfKeyState);
const QPlatformDragQtResponse response = const QPlatformDragQtResponse response =
QWindowSystemInterface::handleDrag(window, windowsDrag->dropData(), m_lastPoint, actions); QWindowSystemInterface::handleDrag(window, windowsDrag->dropData(),
m_lastPoint, actions,
mouseButtons, keyboardModifiers);
m_answerRect = response.answerRect(); m_answerRect = response.answerRect();
const Qt::DropAction action = response.acceptedAction(); const Qt::DropAction action = response.acceptedAction();
@ -522,8 +520,7 @@ void QWindowsOleDropTarget::handleDrag(QWindow *window, DWORD grfKeyState,
*pdwEffect = m_chosenEffect; *pdwEffect = m_chosenEffect;
qCDebug(lcQpaMime) << __FUNCTION__ << m_window qCDebug(lcQpaMime) << __FUNCTION__ << m_window
<< windowsDrag->dropData() << " supported actions=" << actions << windowsDrag->dropData() << " supported actions=" << actions
<< " mods=" << QGuiApplicationPrivate::modifier_buttons << " mods=" << keyboardModifiers << " mouse=" << mouseButtons
<< " mouse=" << QGuiApplicationPrivate::mouse_buttons
<< " accepted: " << response.isAccepted() << action << " accepted: " << response.isAccepted() << action
<< m_answerRect << " effect" << *pdwEffect; << m_answerRect << " effect" << *pdwEffect;
} }
@ -574,13 +571,11 @@ QWindowsOleDropTarget::DragLeave()
qCDebug(lcQpaMime) << __FUNCTION__ << ' ' << m_window; qCDebug(lcQpaMime) << __FUNCTION__ << ' ' << m_window;
QWindowSystemInterface::handleDrag(m_window, 0, QPoint(), Qt::IgnoreAction); QWindowSystemInterface::handleDrag(m_window, 0, QPoint(), Qt::IgnoreAction,
Qt::NoButton, Qt::NoModifier);
if (!QDragManager::self()->source()) { if (!QDragManager::self()->source())
QGuiApplicationPrivate::modifier_buttons = Qt::NoModifier;
QGuiApplicationPrivate::mouse_buttons = Qt::NoButton;
m_lastKeyState = 0; m_lastKeyState = 0;
}
QWindowsDrag::instance()->releaseDropDataObject(); QWindowsDrag::instance()->releaseDropDataObject();
return NOERROR; return NOERROR;
@ -599,18 +594,16 @@ QWindowsOleDropTarget::Drop(LPDATAOBJECT pDataObj, DWORD grfKeyState,
<< "keys=" << grfKeyState << "pt=" << pt.x << ',' << pt.y; << "keys=" << grfKeyState << "pt=" << pt.x << ',' << pt.y;
m_lastPoint = QWindowsGeometryHint::mapFromGlobal(m_window, 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
QGuiApplicationPrivate::mouse_buttons = toQtMouseButtons(m_lastKeyState);
QGuiApplicationPrivate::modifier_buttons = toQtKeyboardModifiers(grfKeyState);
QWindowsDrag *windowsDrag = QWindowsDrag::instance(); QWindowsDrag *windowsDrag = QWindowsDrag::instance();
const QPlatformDropQtResponse response = const QPlatformDropQtResponse response =
QWindowSystemInterface::handleDrop(m_window, windowsDrag->dropData(), QWindowSystemInterface::handleDrop(m_window, windowsDrag->dropData(),
m_lastPoint, m_lastPoint,
translateToQDragDropActions(*pdwEffect)); translateToQDragDropActions(*pdwEffect),
toQtMouseButtons(grfKeyState),
toQtKeyboardModifiers(grfKeyState));
QGuiApplicationPrivate::mouse_buttons = toQtMouseButtons(grfKeyState);
m_lastKeyState = grfKeyState; m_lastKeyState = grfKeyState;
if (response.isAccepted()) { if (response.isAccepted()) {