Properly handle surface resizes in QML compositor.
authorSamuel Rødal <samuel.rodal@nokia.com>
Fri, 1 Apr 2011 12:07:54 +0000 (14:07 +0200)
committerSamuel Rødal <samuel.rodal@nokia.com>
Fri, 1 Apr 2011 12:07:54 +0000 (14:07 +0200)
examples/qml-compositor/main.cpp
examples/qml-compositor/qml/QmlCompositor/main.qml
src/qt-compositor/compositor_api/waylandsurfaceitem.cpp

index 6b7985a..c406d58 100644 (file)
@@ -69,6 +69,7 @@ public:
 signals:
     void windowAdded(QVariant window);
     void windowDestroyed(QVariant window);
+    void windowResized(QVariant window);
 
 public slots:
     void destroyWindow(QVariant window) {
@@ -80,7 +81,12 @@ private slots:
         WaylandSurface *surface = qobject_cast<WaylandSurface *>(sender());
         surface->setGeometry(rect);
 
-        if (!m_windowMap.contains(surface)) {
+        if (m_windowMap.contains(surface)) {
+            WaylandSurfaceItem *item = m_windowMap.value(surface);
+            item->setWidth(rect.width());
+            item->setHeight(rect.height());
+            emit windowResized(QVariant::fromValue(static_cast<QSGItem *>(item)));
+        } else {
             WaylandSurfaceItem *item = new WaylandSurfaceItem(surface, rootObject());
             connect(surface, SIGNAL(destroyed(QObject *)), this, SLOT(surfaceDestroyed(QObject *)));
             emit windowAdded(QVariant::fromValue(static_cast<QSGItem *>(item)));
@@ -122,6 +128,7 @@ int main(int argc, char *argv[])
 
     QObject::connect(&compositor, SIGNAL(windowAdded(QVariant)), compositor.rootObject(), SLOT(windowAdded(QVariant)));
     QObject::connect(&compositor, SIGNAL(windowDestroyed(QVariant)), compositor.rootObject(), SLOT(windowDestroyed(QVariant)));
+    QObject::connect(&compositor, SIGNAL(windowResized(QVariant)), compositor.rootObject(), SLOT(windowResized(QVariant)));
 
     return app.exec();
 
index 8024a6e..b65d712 100644 (file)
@@ -75,6 +75,14 @@ Item {
         windowContainer.chrome = windowChrome;
     }
 
+    function windowResized(window) {
+        var windowContainer = window.parent;
+        windowContainer.width = window.width;
+        windowContainer.height = window.height;
+
+        CompositorLogic.relayout();
+    }
+
     function windowDestroyed(window) {
         var windowContainer = window.parent;
         windowContainer.runDestroyAnimation();
index 90985f1..66927a3 100644 (file)
@@ -167,8 +167,6 @@ void WaylandSurfaceItem::surfaceMapped(const QRect &rect)
 {
     setWidth(rect.width());
     setHeight(rect.height());
-
-    update();
 }
 
 QSGNode *WaylandSurfaceItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)