wasm: send mouse release to proper window

When the mouse is released, it gets the current window to send the
event to from the pointer position.
If the release happens out of the browser viewport, that window is null
and the release event essentially gets ignored. This change keeps
the last known QWindow object to send the event to until the release.

Also replace hardcoded emscripten events with enum names.

Task-number: QTBUG-71948
Change-Id: I354d14479a43489f210cca31d6b9e0f65d083bb0
Fixes: QTBUG-71948
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: Mikhail Svetkin <mikhail.svetkin@qt.io>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
bb10
Lorn Potter 2018-11-26 10:05:15 +10:00
parent ae825a48dc
commit 582237a593
2 changed files with 17 additions and 11 deletions

View File

@ -63,6 +63,7 @@ EMSCRIPTEN_BINDINGS(mouse_module) {
QWasmEventTranslator::QWasmEventTranslator(QObject *parent)
: QObject(parent)
, draggedWindow(nullptr)
, lastWindow(nullptr)
, pressedButtons(Qt::NoButton)
, resizeMode(QWasmWindow::ResizeNone)
{
@ -370,15 +371,16 @@ void QWasmEventTranslator::processMouse(int eventType, const EmscriptenMouseEven
Qt::KeyboardModifiers modifiers = translateMouseEventModifier(mouseEvent);
QWindow *window2 = QWasmIntegration::get()->compositor()->windowAt(point, 5);
if (window2 != nullptr)
lastWindow = window2;
QWasmWindow *htmlWindow = static_cast<QWasmWindow*>(window2->handle());
bool onFrame = false;
if (window2 && !window2->geometry().contains(point))
onFrame = true;
bool interior = window2 && window2->geometry().contains(point);
QPoint localPoint(point.x() - window2->geometry().x(), point.y() - window2->geometry().y());
switch (eventType) {
case 5: //down
case EMSCRIPTEN_EVENT_MOUSEDOWN:
{
if (window2)
window2->raise();
@ -403,7 +405,7 @@ void QWasmEventTranslator::processMouse(int eventType, const EmscriptenMouseEven
htmlWindow->injectMousePressed(localPoint, point, button, modifiers);
break;
}
case 6: //up
case EMSCRIPTEN_EVENT_MOUSEUP:
{
pressedButtons.setFlag(translateMouseButton(mouseEvent->button), false);
buttonEventType = QEvent::MouseButtonRelease;
@ -414,7 +416,6 @@ void QWasmEventTranslator::processMouse(int eventType, const EmscriptenMouseEven
pressedWindow = nullptr;
}
if (mouseEvent->button == 0) {
draggedWindow = nullptr;
resizeMode = QWasmWindow::ResizeNone;
@ -424,7 +425,7 @@ void QWasmEventTranslator::processMouse(int eventType, const EmscriptenMouseEven
oldWindow->injectMouseReleased(localPoint, point, button, modifiers);
break;
}
case 8://move //drag event
case EMSCRIPTEN_EVENT_MOUSEMOVE: // drag event
{
buttonEventType = QEvent::MouseMove;
if (!(htmlWindow->m_windowState & Qt::WindowFullScreen) && !(htmlWindow->m_windowState & Qt::WindowMaximized)) {
@ -440,11 +441,15 @@ void QWasmEventTranslator::processMouse(int eventType, const EmscriptenMouseEven
}
break;
}
default:
default: // MOUSELEAVE MOUSEENTER
break;
};
if (window2 && !onFrame) {
if (!window2 && buttonEventType == QEvent::MouseButtonRelease) {
window2 = lastWindow;
lastWindow = nullptr;
interior = true;
}
if (window2 && interior) {
QWindowSystemInterface::handleMouseEvent<QWindowSystemInterface::SynchronousDelivery>(
window2, timestamp, localPoint, point, pressedButtons, button, buttonEventType, modifiers);
}

View File

@ -197,6 +197,7 @@ private:
private:
QWindow *draggedWindow;
QWindow *pressedWindow;
QWindow *lastWindow;
Qt::MouseButtons pressedButtons;
QWasmWindow::ResizeMode resizeMode;