summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2022-03-11 09:17:25 +0100
committerLiang Qi <liang.qi@qt.io>2022-04-04 20:46:24 +0200
commit16aec91bd8a28b2c9e741eb4db38132de73e6c7f (patch)
tree686b43a817c99b2a596528335cd6196d4693a027
parent5288fc2c68bc1097a0c4853364d1f297188e5d9d (diff)
client: Synthesize enter/leave event for popup in xdg-shell
Fixes: QTBUG-100148 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> (cherry picked from commit 73d35d3117722cef8e94f0d2036c56ad0a5ddae9) Reviewed-by: Liang Qi <liang.qi@qt.io>
-rw-r--r--src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
index ac5d50a13..e11745505 100644
--- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
+++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
@@ -220,6 +220,16 @@ QWaylandXdgSurface::Popup::~Popup()
auto *shell = m_xdgSurface->m_shell;
Q_ASSERT(shell->m_topmostGrabbingPopup == this);
shell->m_topmostGrabbingPopup = m_parent->m_popup;
+ 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());
}
}
@@ -441,6 +451,23 @@ void QWaylandXdgSurface::setGrabPopup(QWaylandWindow *parent, QWaylandInputDevic
}
setPopup(parent);
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)