diff options
author | Daniel d'Andrada <daniel.dandrada@luxoft.com> | 2018-12-10 09:55:54 +0100 |
---|---|---|
committer | Robert Griebl <robert.griebl@pelagicore.com> | 2018-12-11 10:34:52 +0000 |
commit | 322f7eace9fa7457cad3e5fd5bb5032c4abfca95 (patch) | |
tree | 5e21f2e207394b504750f4436aa6cf4f106523ac | |
parent | 05a3bb55ce78d785a77bc8c8aaab2fd82b0bc0b5 (diff) |
Keep windowProperties when there's no surface anymore
Fixes: AUTOSUITE-694
Change-Id: Ibfbf701fd281d5a5017a8eed4d8e0d9f292ea3b4
Reviewed-by: Robert Griebl <robert.griebl@pelagicore.com>
-rw-r--r-- | src/window-lib/waylandwindow.cpp | 13 | ||||
-rw-r--r-- | src/window-lib/waylandwindow.h | 1 | ||||
-rw-r--r-- | tests/qml/windowitem/tst_windowitem.qml | 18 |
3 files changed, 29 insertions, 3 deletions
diff --git a/src/window-lib/waylandwindow.cpp b/src/window-lib/waylandwindow.cpp index eeafce86..9974cfd6 100644 --- a/src/window-lib/waylandwindow.cpp +++ b/src/window-lib/waylandwindow.cpp @@ -79,8 +79,10 @@ WaylandWindow::WaylandWindow(AbstractApplication *app, WindowSurface *surf) connect(surf->compositor()->amExtension(), &WaylandQtAMServerExtension::windowPropertyChanged, this, [this](QWaylandSurface *surface, const QString &name, const QVariant &value) { - if (surface == m_surface) + if (surface == m_surface) { + m_windowProperties[name] = value; emit windowPropertyChanged(name, value); + } }); connect(surf, &QWaylandSurface::surfaceDestroyed, this, [this]() { @@ -89,6 +91,11 @@ WaylandWindow::WaylandWindow(AbstractApplication *app, WindowSurface *surf) emit waylandSurfaceChanged(); }); + // Caching them so that Window::windowProperty and Window::windowProperties + // still return the expected values even after the underlying wayland surface + // is gone (content state NoSurface). + m_windowProperties = m_surface->compositor()->amExtension()->windowProperties(m_surface); + enableOrDisablePing(); } } @@ -125,12 +132,12 @@ bool WaylandWindow::setWindowProperty(const QString &name, const QVariant &value QVariant WaylandWindow::windowProperty(const QString &name) const { - return windowProperties().value(name); + return m_windowProperties.value(name); } QVariantMap WaylandWindow::windowProperties() const { - return m_surface ? m_surface->compositor()->amExtension()->windowProperties(m_surface) : QVariantMap(); + return m_windowProperties; } auto WaylandWindow::contentState() const -> ContentState diff --git a/src/window-lib/waylandwindow.h b/src/window-lib/waylandwindow.h index 7f69fb2e..328c91aa 100644 --- a/src/window-lib/waylandwindow.h +++ b/src/window-lib/waylandwindow.h @@ -94,6 +94,7 @@ private: QTimer *m_pingTimer; QTimer *m_pongTimer; WindowSurface *m_surface; + QVariantMap m_windowProperties; }; QT_END_NAMESPACE_AM diff --git a/tests/qml/windowitem/tst_windowitem.qml b/tests/qml/windowitem/tst_windowitem.qml index c388e11e..a90fa1f0 100644 --- a/tests/qml/windowitem/tst_windowitem.qml +++ b/tests/qml/windowitem/tst_windowitem.qml @@ -469,5 +469,23 @@ Item { compare(window.windowProperty("clickCount"), 1); } + + // Checks that window properties are kept even when contentState is WindowObject.NoSurface + // Regression test for https://bugreports.qt.io/browse/AUTOSUITE-694 + function test_window_keep_properties_when_nosurface() { + initWindowItemsModel(); + + var window = windowItemsModel.get(0).window; + + compare(window.contentState, WindowObject.SurfaceWithContent); + + window.setWindowProperty("foo", "bar"); + compare(window.windowProperty("foo"), "bar"); + + app.stop(); + + tryCompare(window, "contentState", WindowObject.NoSurface); + compare(window.windowProperty("foo"), "bar"); + } } } |