diff options
author | Johan Klokkhammer Helsing <johan.helsing@qt.io> | 2019-02-04 16:34:52 +0100 |
---|---|---|
committer | Johan Helsing <johan.helsing@qt.io> | 2019-02-12 10:27:57 +0000 |
commit | 4b58ff21f4a3c629867064289b6c778bbb57f95a (patch) | |
tree | 4694a2cd8eaa4035ad7a9c2f716195845ca12479 /src/plugins/shellintegration/xdg-shell | |
parent | 2824a71e5c28ec1843edc056f2c17c6274378f1d (diff) | |
download | qtwayland-4b58ff21f4a3c629867064289b6c778bbb57f95a.tar.gz |
Client xdg-shell: Fix crash when switching popups
The call to flushWindowSystemEvents() sometimes caused new popups to be shown
in the middle of hiding another. I.e. if multiple events show and hide
surfaces, they would be shown/hidden in opposite order of their corresponding
events. QMenus sometimes suffered from this (can be seen with the qopenglwidget
example from qtbase).
When the flush was added 5 years ago in 50f43a0c5, it was to "reduce the
chances of seeing a bad frame". I don't see any rendering artifacts, though,
and I can't find any bug report on it. So let's hope it's safe to remove the
hack.
[ChangeLog][QPA plugin] Fixed a crash that sometimes happened when switching
popups.
Also adds more info to the workaround warning message that appears when a popup
grab is attempted and there already is another grabbing popup that is not the
parent.
Fixes: QTBUG-73524
Change-Id: Ibfcbb48c4bbe295c2be1a30add2d7e05cad398c5
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
Diffstat (limited to 'src/plugins/shellintegration/xdg-shell')
-rw-r--r-- | src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp index 1310e340..d2452aa4 100644 --- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp +++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp @@ -369,7 +369,14 @@ void QWaylandXdgSurface::setGrabPopup(QWaylandWindow *parent, QWaylandInputDevic auto *top = m_shell->m_topmostGrabbingPopup; if (top && top->m_xdgSurface != parentXdgSurface) { - qCWarning(lcQpaWayland) << "setGrabPopup called for a surface that was not the topmost popup, positions might be off."; + qCWarning(lcQpaWayland) << "setGrabPopup called with a parent," << parentXdgSurface + << "which does not match the current topmost grabbing popup," + << top->m_xdgSurface << "According to the xdg-shell protocol, this" + << "is not allowed. The wayland QPA plugin is currently handling" + << "it by setting the parent to the topmost grabbing popup." + << "Note, however, that this may cause positioning errors and" + << "popups closing unxpectedly because xdg-shell mandate that child" + << "popups close before parents"; parent = top->m_xdgSurface->m_window; } setPopup(parent); |