New HomeScreen API calls getSurfaceStatus and getAllSurfacesOfProcess.
[staging/HomeScreen.git] / HomeScreen / src / layouthandler.cpp
index 81bc106..35304e6 100644 (file)
@@ -4,14 +4,16 @@ LayoutHandler::LayoutHandler(QObject *parent) :
     QObject(parent),
     mp_dBusWindowManagerProxy(0),
     mp_dBusPopupProxy(0),
-    m_visibleApps(),
-    m_invisibleApps(),
-    m_requestsToBeVisibleApps()
+    m_visibleSurfaces(),
+    m_invisibleSurfaces(),
+    m_requestsToBeVisibleSurfaces()
 {
     qDBusRegisterMetaType<SimplePoint>();
     qDBusRegisterMetaType<QList<SimplePoint> >();
-    qDBusRegisterMetaType<SimpleRect>();
-    qDBusRegisterMetaType<QList<SimpleRect> >();
+    qDBusRegisterMetaType<LayoutArea>();
+    qDBusRegisterMetaType<QList<LayoutArea> >();
+    qDBusRegisterMetaType<Layout>();
+    qDBusRegisterMetaType<QList<Layout> >();
 
     qDebug("D-Bus: connect to org.agl.windowmanager /windowmanager");
     mp_dBusWindowManagerProxy = new org::agl::windowmanager("org.agl.windowmanager",
@@ -34,10 +36,8 @@ LayoutHandler::~LayoutHandler()
 void LayoutHandler::setUpLayouts()
 {
     qDebug("setUpLayouts");
-    QList<SimpleRect> surfaceAreas;
-    SimpleRect surfaceArea;
-    bool isFullScreen;
-    int associatedFullScreenLayout;
+    QList<LayoutArea> surfaceAreas;
+    LayoutArea surfaceArea;
 
     const int SCREEN_WIDTH = 1080;
     const int SCREEN_HEIGHT = 1920;
@@ -61,10 +61,7 @@ void LayoutHandler::setUpLayouts()
 
     surfaceAreas.append(surfaceArea);
 
-    isFullScreen = false;
-    associatedFullScreenLayout = 4;
-
-    mp_dBusWindowManagerProxy->addLayout(1, "one app", isFullScreen, associatedFullScreenLayout, surfaceAreas);
+    mp_dBusWindowManagerProxy->addLayout(1, "one app", surfaceAreas);
 
 
     surfaceAreas.clear();
@@ -88,10 +85,7 @@ void LayoutHandler::setUpLayouts()
 
     surfaceAreas.append(surfaceArea);
 
-    isFullScreen = false;
-    associatedFullScreenLayout = -1;
-
-    mp_dBusWindowManagerProxy->addLayout(2, "top on bottom", isFullScreen, associatedFullScreenLayout, surfaceAreas);
+    mp_dBusWindowManagerProxy->addLayout(2, "top on bottom", surfaceAreas);
 
 
     surfaceAreas.clear();
@@ -115,119 +109,119 @@ void LayoutHandler::setUpLayouts()
 
     surfaceAreas.append(surfaceArea);
 
-    isFullScreen = false;
-    associatedFullScreenLayout = -1;
-
-    mp_dBusWindowManagerProxy->addLayout(3, "side by side", isFullScreen, associatedFullScreenLayout, surfaceAreas);
-
-
-    surfaceAreas.clear();
-
-    // layout 4:
-    // one app surface full screen, no statusbar, no control bar
-    surfaceArea.x = 0;
-    surfaceArea.y = 0;
-    surfaceArea.width = SCREEN_WIDTH;
-    surfaceArea.height = SCREEN_HEIGHT;
-
-    surfaceAreas.append(surfaceArea);
-
-    isFullScreen = true;
-    associatedFullScreenLayout = 1;
-
-    mp_dBusWindowManagerProxy->addLayout(4, "one app full screen", isFullScreen, associatedFullScreenLayout, surfaceAreas);
-
-
-    surfaceAreas.clear();
-
+    mp_dBusWindowManagerProxy->addLayout(3, "side by side", surfaceAreas);
 }
 
 void LayoutHandler::makeMeVisible(int pid)
 {
     qDebug("makeMeVisible %d", pid);
-    m_requestsToBeVisibleApps.append(pid);
 
-    qDebug("m_visibleApps %d", m_visibleApps.size());
-    qDebug("m_invisibleApps %d", m_invisibleApps.size());
-    qDebug("m_requestsToBeVisibleApps %d", m_requestsToBeVisibleApps.size());
+    QList<int> allSurfaces = mp_dBusWindowManagerProxy->getAllSurfacesOfProcess(pid);
+    qSort(allSurfaces);
 
-    QList<int> availableLayouts = mp_dBusWindowManagerProxy->getAvailableLayouts(m_visibleApps.size() + m_requestsToBeVisibleApps.size());
-    if (0 == availableLayouts.size())
+    if (0 != allSurfaces.size())
     {
-        // no layout fits the need!
-        // replace the last app
-        qDebug("no layout fits the need!");
-        qDebug("replace the last app");
-
-        m_invisibleApps.append(m_visibleApps.last());
-        m_visibleApps.removeLast();
+        m_requestsToBeVisibleSurfaces.append(allSurfaces.at(0));
 
-        m_visibleApps.append(m_requestsToBeVisibleApps);
-        m_requestsToBeVisibleApps.clear();
+        qDebug("m_visibleSurfaces %d", m_visibleSurfaces.size());
+        qDebug("m_invisibleSurfaces %d", m_invisibleSurfaces.size());
+        qDebug("m_requestsToBeVisibleSurfaces %d", m_requestsToBeVisibleSurfaces.size());
 
-        for (int i = 0; i < m_visibleApps.size(); ++i)
+        QList<int> availableLayouts = mp_dBusWindowManagerProxy->getAvailableLayouts(m_visibleSurfaces.size() + m_requestsToBeVisibleSurfaces.size());
+        if (0 == availableLayouts.size())
         {
-            mp_dBusWindowManagerProxy->setPidToLayoutArea(m_visibleApps.at(i), i);
-        }
-    }
-    if (1 == availableLayouts.size())
-    {
-        // switch to new layout
-        qDebug("switch to new layout %d", availableLayouts.at(0));
-        m_visibleApps.append(m_requestsToBeVisibleApps);
-        m_requestsToBeVisibleApps.clear();
+            // no layout fits the need!
+            // replace the last app
+            qDebug("no layout fits the need!");
+            qDebug("replace the last surface");
 
-        mp_dBusWindowManagerProxy->setLayoutById(availableLayouts.at(0));
-        for (int i = 0; i < m_visibleApps.size(); ++i)
-        {
-            mp_dBusWindowManagerProxy->setPidToLayoutArea(m_visibleApps.at(i), i);
-        }
-    }
-    if (1 < availableLayouts.size())
-    {
-        // more than one layout possible! Ask user.
-        qDebug("more than one layout possible! Ask user.");
+            m_invisibleSurfaces.append(m_visibleSurfaces.last());
+            m_visibleSurfaces.removeLast();
+
+            m_visibleSurfaces.append(m_requestsToBeVisibleSurfaces);
+            m_requestsToBeVisibleSurfaces.clear();
 
-        QStringList choices;
-        for (int i = 0; i < availableLayouts.size(); ++i)
+            for (int i = 0; i < m_visibleSurfaces.size(); ++i)
+            {
+                mp_dBusWindowManagerProxy->setSurfaceToLayoutArea(m_visibleSurfaces.at(i), i);
+            }
+        }
+        if (1 == availableLayouts.size())
         {
-            choices.append(mp_dBusWindowManagerProxy->getLayoutName(availableLayouts.at(i)));
+            // switch to new layout
+            qDebug("switch to new layout %d", availableLayouts.at(0));
+            m_visibleSurfaces.append(m_requestsToBeVisibleSurfaces);
+            m_requestsToBeVisibleSurfaces.clear();
+
+            mp_dBusWindowManagerProxy->setLayoutById(availableLayouts.at(0));
+            for (int i = 0; i < m_visibleSurfaces.size(); ++i)
+            {
+                mp_dBusWindowManagerProxy->setSurfaceToLayoutArea(m_visibleSurfaces.at(i), i);
+            }
         }
+        if (1 < availableLayouts.size())
+        {
+            // more than one layout possible! Ask user.
+            qDebug("more than one layout possible! Ask user.");
 
-        mp_dBusPopupProxy->showPopupComboBox("Select Layout", choices);
+            QStringList choices;
+            for (int i = 0; i < availableLayouts.size(); ++i)
+            {
+                choices.append(mp_dBusWindowManagerProxy->getLayoutName(availableLayouts.at(i)));
+            }
 
+            mp_dBusPopupProxy->showPopupComboBox("Select Layout", choices);
+        }
     }
 }
 
-void LayoutHandler::toggleFullscreen()
+QList<int> LayoutHandler::requestGetAllSurfacesOfProcess(int pid)
 {
-    qDebug("toggleFullscreen");
-    int currentLayout = mp_dBusWindowManagerProxy->getLayout();
-    int associatedFullScreenLayout = mp_dBusWindowManagerProxy->getAssociatedFullScreenLayout(currentLayout);
-    if (-1 != associatedFullScreenLayout)
+    qDebug("requestGetAllSurfacesOfProcess %d", pid);
+
+    return mp_dBusWindowManagerProxy->getAllSurfacesOfProcess(pid);
+}
+
+int LayoutHandler::requestGetSurfaceStatus(int surfaceId)
+{
+    int result = -1;
+
+    if (-1 != m_visibleSurfaces.indexOf(surfaceId))
     {
-        mp_dBusWindowManagerProxy->setLayoutById(associatedFullScreenLayout);
-        for (int i = 0; i < m_visibleApps.size(); ++i)
-        {
-            mp_dBusWindowManagerProxy->setPidToLayoutArea(m_visibleApps.at(i), i);
-        }
+        result = 0;
+    }
+    if (-1 != m_invisibleSurfaces.indexOf(surfaceId))
+    {
+        result = 1;
     }
-    else
+    if (-1 != m_requestsToBeVisibleSurfaces.indexOf(surfaceId))
     {
-        qDebug("no associatedFullScreenLayout. Cannot switch to full screen.");
+        result = 1;
     }
+
+    return result;
+}
+
+void LayoutHandler::requestRenderSurfaceToArea(int surfaceId, const QRect &renderArea)
+{
+    qDebug("requestRenderSurfaceToArea %d %d,%d,%d,%d", surfaceId, renderArea.x(), renderArea.y(), renderArea.width(), renderArea.height());
+}
+
+void LayoutHandler::requestSurfaceIdToFullScreen(int surfaceId)
+{
+    qDebug("requestSurfaceIdToFullScreen %d", surfaceId);
 }
 
 void LayoutHandler::setLayoutByName(QString layoutName)
 {
     // switch to new layout
     qDebug("setLayout: switch to new layout %s", layoutName.toStdString().c_str());
-    m_visibleApps.append(m_requestsToBeVisibleApps);
-    m_requestsToBeVisibleApps.clear();
+    m_visibleSurfaces.append(m_requestsToBeVisibleSurfaces);
+    m_requestsToBeVisibleSurfaces.clear();
 
     mp_dBusWindowManagerProxy->setLayoutByName(layoutName);
-    for (int i = 0; i < m_visibleApps.size(); ++i)
+    for (int i = 0; i < m_visibleSurfaces.size(); ++i)
     {
-        mp_dBusWindowManagerProxy->setPidToLayoutArea(i, i);
+        mp_dBusWindowManagerProxy->setSurfaceToLayoutArea(i, i);
     }
 }