summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel d'Andrada <daniel.dandrada@luxoft.com>2018-12-10 09:55:54 +0100
committerRobert Griebl <robert.griebl@pelagicore.com>2018-12-11 10:34:52 +0000
commit322f7eace9fa7457cad3e5fd5bb5032c4abfca95 (patch)
tree5e21f2e207394b504750f4436aa6cf4f106523ac
parent05a3bb55ce78d785a77bc8c8aaab2fd82b0bc0b5 (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.cpp13
-rw-r--r--src/window-lib/waylandwindow.h1
-rw-r--r--tests/qml/windowitem/tst_windowitem.qml18
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");
+ }
}
}