summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Klokkhammer Helsing <johan.helsing@qt.io>2017-10-19 12:13:01 +0200
committerJohan Helsing <johan.helsing@qt.io>2017-10-25 08:48:10 +0000
commita5c4af696b4fa0747b278830d07f4360e73b1f63 (patch)
tree24d065d060aa54445069c787bd6b06920e32f736
parentebd732dfc91d5607b7ec66e3ab25a7db0a86244c (diff)
Ensure QWaylandWindow::transientParent has a shell surface
This may not be a perfect solution, but it's better than the current one, where the transient parent may not have a shell surface (because the window may be hidden or not yet initialized). Task-number: QTBUG-63840 Change-Id: Ia5f04376d4b6d12b41ceeab5ba13cdc1b63b4e3c Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
-rw-r--r--src/client/qwaylandwindow.cpp27
1 files changed, 16 insertions, 11 deletions
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index f7f296d0a..6d7c0885c 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -785,22 +785,27 @@ QWaylandAbstractDecoration *QWaylandWindow::decoration() const
return mWindowDecoration;
}
-static QWindow *topLevelWindow(QWindow *window)
+static QWaylandWindow *closestShellSurfaceWindow(QWindow *window)
{
- while (QWindow *parent = window->parent())
- window = parent;
- return window;
+ while (window) {
+ auto w = static_cast<QWaylandWindow *>(window->handle());
+ if (w->shellSurface())
+ return w;
+ window = window->transientParent() ? window->transientParent() : window->parent();
+ }
+ return nullptr;
}
QWaylandWindow *QWaylandWindow::transientParent() const
{
- // Take the top level window here, since the transient parent may be a QWidgetWindow
- // or some other window without a shell surface, which is then not able to get mouse
- // events.
- if (auto transientParent = window()->transientParent())
- return static_cast<QWaylandWindow *>(topLevelWindow(transientParent)->handle());
- else if (QGuiApplication::focusWindow() && (window()->type() == Qt::ToolTip || window()->type() == Qt::Popup))
- return static_cast<QWaylandWindow *>(topLevelWindow(QGuiApplication::focusWindow())->handle());
+ // Take the closest window with a shell surface, since the transient parent may be a
+ // QWidgetWindow or some other window without a shell surface, which is then not able to
+ // get mouse events.
+ if (auto transientParent = closestShellSurfaceWindow(window()->transientParent()))
+ return transientParent;
+
+ if (QGuiApplication::focusWindow() && (window()->type() == Qt::ToolTip || window()->type() == Qt::Popup))
+ return closestShellSurfaceWindow(QGuiApplication::focusWindow());
return nullptr;
}