client: Synthesize enter/leave event for popup in xdg-shell
Fixes: QTBUG-100148 Pick-to: 6.3 6.2 5.15 Change-Id: I45e3156d7942cff9968674c0b253d15be7235921 Reviewed-by: Tang Haixiang <tanghaixiang@uniontech.com> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
parent
dd83a27fec
commit
179d0d34fa
@ -226,6 +226,16 @@ QWaylandXdgSurface::Popup::~Popup()
|
|||||||
auto *shell = m_xdgSurface->m_shell;
|
auto *shell = m_xdgSurface->m_shell;
|
||||||
Q_ASSERT(shell->m_topmostGrabbingPopup == this);
|
Q_ASSERT(shell->m_topmostGrabbingPopup == this);
|
||||||
shell->m_topmostGrabbingPopup = m_parent ? m_parent->m_popup : nullptr;
|
shell->m_topmostGrabbingPopup = m_parent ? m_parent->m_popup : nullptr;
|
||||||
|
m_grabbing = false;
|
||||||
|
|
||||||
|
// Synthesize Qt enter/leave events for popup
|
||||||
|
QWindow *leave = nullptr;
|
||||||
|
if (m_xdgSurface && m_xdgSurface->window())
|
||||||
|
leave = m_xdgSurface->window()->window();
|
||||||
|
QWindowSystemInterface::handleLeaveEvent(leave);
|
||||||
|
|
||||||
|
if (QWindow *enter = QGuiApplication::topLevelAt(QCursor::pos()))
|
||||||
|
QWindowSystemInterface::handleEnterEvent(enter, enter->mapFromGlobal(QCursor::pos()), QCursor::pos());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -462,6 +472,23 @@ void QWaylandXdgSurface::setGrabPopup(QWaylandWindow *parent, QWaylandInputDevic
|
|||||||
}
|
}
|
||||||
setPopup(parent);
|
setPopup(parent);
|
||||||
m_popup->grab(device, serial);
|
m_popup->grab(device, serial);
|
||||||
|
|
||||||
|
// Synthesize Qt enter/leave events for popup
|
||||||
|
if (!parent)
|
||||||
|
return;
|
||||||
|
QWindow *current = QGuiApplication::topLevelAt(QCursor::pos());
|
||||||
|
QWindow *leave = parent->window();
|
||||||
|
if (current != leave)
|
||||||
|
return;
|
||||||
|
|
||||||
|
QWindowSystemInterface::handleLeaveEvent(leave);
|
||||||
|
|
||||||
|
QWindow *enter = nullptr;
|
||||||
|
if (m_popup && m_popup->m_xdgSurface && m_popup->m_xdgSurface->window())
|
||||||
|
enter = m_popup->m_xdgSurface->window()->window();
|
||||||
|
|
||||||
|
if (enter)
|
||||||
|
QWindowSystemInterface::handleEnterEvent(enter, enter->mapFromGlobal(QCursor::pos()), QCursor::pos());
|
||||||
}
|
}
|
||||||
|
|
||||||
void QWaylandXdgSurface::xdg_surface_configure(uint32_t serial)
|
void QWaylandXdgSurface::xdg_surface_configure(uint32_t serial)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user