Make compilable on non HAVE_IVI_LAYERMANAGEMENT_API systems
[staging/HomeScreen.git] / WindowManager / src / windowmanager.cpp
index edcbf9e..101f5b3 100644 (file)
 
 #define WINDOWMANAGER_LAYER_NUM 4
 
+#define WINDOWMANAGER_LAYER_ID_SHIFT 22
+
 // the HomeScreen app has to have the surface id 1000
 #define WINDOWMANAGER_HOMESCREEN_MAIN_SURFACE_ID 1000
 
-
 void* WindowManager::myThis = 0;
 
 WindowManager::WindowManager(QObject *parent) :
     QObject(parent),
     m_layouts(),
-    m_appSurfaces(),
+    //    m_appSurfaces(),
     mp_layoutAreaToSurfaceIdAssignment(0),
     m_currentLayout(-1),
     m_screenId(0), // use screen "0"
     m_screenWidth(0),
     m_screenHeight(0)
+#ifdef HAVE_IVI_LAYERMANAGEMENT_API
+  ,
+    m_appLayers(),
+    m_pending_to_show(-1)
+#endif
 {
+#ifdef HAVE_IVI_LAYERMANAGEMENT_API
+    m_showLayers = new t_ilm_layer[WINDOWMANAGER_LAYER_NUM];
+
+    m_showLayers[0] = 0; /* POPUP is not shown by default */
+    m_showLayers[1] = 0; /* HOMESCREEN_OVERLAY is not shown by default */
+    m_showLayers[2] = 0; /* APPLICATIONS is not shown by default */
+    m_showLayers[3] = WINDOWMANAGER_LAYER_HOMESCREEN; /* HOMESCREEN is shwon by default */
+
+#endif
     qDebug("-=[WindowManager]=-");
 }
 
@@ -73,7 +88,7 @@ void WindowManager::start()
 
     createNewLayer(WINDOWMANAGER_LAYER_POPUP);
     createNewLayer(WINDOWMANAGER_LAYER_HOMESCREEN_OVERLAY);
-    createNewLayer(WINDOWMANAGER_LAYER_APPLICATIONS);
+//  createNewLayer(WINDOWMANAGER_LAYER_APPLICATIONS);
     createNewLayer(WINDOWMANAGER_LAYER_HOMESCREEN);
 
     ilm_registerNotification(WindowManager::notificationFunc_static, this);
@@ -97,6 +112,21 @@ WindowManager::~WindowManager()
     delete mp_layoutAreaToSurfaceIdAssignment;
 }
 
+#ifdef HAVE_IVI_LAYERMANAGEMENT_API
+int WindowManager::getLayerRenderOrder(t_ilm_layer id_array[])
+{
+    int i, j;
+
+    for (i = WINDOWMANAGER_LAYER_NUM - 1, j = 0; i >= 0; i--, j++) {
+        if (m_showLayers[i] != 0) {
+            id_array[j] = m_showLayers[i];
+        }
+    }
+
+    return j;
+}
+#endif
+
 void WindowManager::dumpScene()
 {
     qDebug("\n");
@@ -146,6 +176,47 @@ void WindowManager::createNewLayer(int layerId)
     ilm_commitChanges();
 }
 
+t_ilm_layer WindowManager::getAppLayerID(pid_t pid)
+{
+    t_ilm_layer layer_id;
+
+//    layer_id = pid + (WINDOWMANAGER_LAYER_APPLICATIONS << WINDOWMANAGER_LAYER_ID_SHIFT);
+    layer_id = pid + (WINDOWMANAGER_LAYER_APPLICATIONS * 100000); /* for debug */
+
+    return layer_id;
+}
+
+void WindowManager::addSurfaceToAppLayer(int surfaceId)
+{
+    struct ilmSurfaceProperties surfaceProperties;
+    t_ilm_layer layer_id;
+    int found = 0;
+    pid_t pid;
+
+    qDebug("-=[addSurfaceToAppLayer]=-");
+    qDebug("  surfaceId %d", surfaceId);
+
+    ilm_getPropertiesOfSurface(surfaceId, &surfaceProperties);
+    pid = surfaceProperties.creatorPid;
+
+    if (pid < 0) {
+        /* No process */
+        qDebug("addSurfaceToAppLayer(%d) got pid == -1", surfaceId);
+        return;
+    }
+
+    QMap<pid_t, t_ilm_layer>::const_iterator i = m_appLayers.find(pid);
+    if (i == m_appLayers.end()) {
+        qDebug("No layer found, create new for app(pid=%d)", pid);
+
+        /* not found, create new one */
+        t_ilm_layer layer_id = getAppLayerID(pid);
+
+        createNewLayer(layer_id);
+        m_appLayers.insert(pid, layer_id);
+    }
+}
+
 void WindowManager::addSurfaceToLayer(int surfaceId, int layerId)
 {
     qDebug("-=[addSurfaceToLayer]=-");
@@ -165,7 +236,7 @@ void WindowManager::addSurfaceToLayer(int surfaceId, int layerId)
 
         ilm_layerAddSurface(layerId, surfaceId);
     }
-
+#if 0
     if (layerId == WINDOWMANAGER_LAYER_APPLICATIONS)
     {
         struct ilmSurfaceProperties surfaceProperties;
@@ -178,7 +249,7 @@ void WindowManager::addSurfaceToLayer(int surfaceId, int layerId)
 
         ilm_layerAddSurface(layerId, surfaceId);
     }
-
+#endif
     if (layerId == WINDOWMANAGER_LAYER_HOMESCREEN_OVERLAY)
     {
         struct ilmSurfaceProperties surfaceProperties;
@@ -214,7 +285,8 @@ void WindowManager::updateScreen()
 {
     qDebug("-=[updateScreen]=-");
 
-#ifdef HAVE_IVI_LAYERMANAGEMENT_API
+#if 0
+//#ifdef HAVE_IVI_LAYERMANAGEMENT_API
     if (-1 != m_currentLayout)
     {
         // hide all surfaces
@@ -281,16 +353,17 @@ void WindowManager::updateScreen()
     ilm_getSurfaceIDsOnLayer(WINDOWMANAGER_LAYER_POPUP, &length, &pArray);
     ilm_layerSetRenderOrder(WINDOWMANAGER_LAYER_POPUP, pArray, length);
     ilm_commitChanges();
-
-    // display layer render order
-    t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
-    renderOrder[0] = WINDOWMANAGER_LAYER_HOMESCREEN;
-    renderOrder[1] = WINDOWMANAGER_LAYER_APPLICATIONS;
-    renderOrder[2] = WINDOWMANAGER_LAYER_HOMESCREEN_OVERLAY;
-    renderOrder[3] = WINDOWMANAGER_LAYER_POPUP;
-    ilm_displaySetRenderOrder(0, renderOrder, WINDOWMANAGER_LAYER_NUM);
-    ilm_displaySetRenderOrder(1, renderOrder, WINDOWMANAGER_LAYER_NUM);
-    ilm_commitChanges();
+#endif
+#ifdef HAVE_IVI_LAYERMANAGEMENT_API
+    if (m_pending_to_show != -1) {
+        showAppLayer(m_pending_to_show);
+    } else {
+        // display layer render order
+        t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
+        int num_layers = getLayerRenderOrder(renderOrder);
+        ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
+        ilm_commitChanges();
+    }
 #endif
 }
 
@@ -320,9 +393,9 @@ void WindowManager::notificationFunc_non_static(ilmObjectType object,
             }
             else
             {
+                addSurfaceToAppLayer(id);
                 //addSurfaceToLayer(id, WINDOWMANAGER_LAYER_APPLICATIONS);
-
-                m_appSurfaces.append(id);
+                //m_appSurfaces.append(id);
             }
             ilm_surfaceAddNotification(id, surfaceCallbackFunction_static);
 
@@ -331,10 +404,12 @@ void WindowManager::notificationFunc_non_static(ilmObjectType object,
         else
         {
             qDebug("Surface destroyed, ID: %d", id);
+#if 0
             m_appSurfaces.removeAt(m_appSurfaces.indexOf(id));
             ilm_surfaceRemoveNotification(id);
 
             ilm_commitChanges();
+#endif
         }
     }
     if (ILM_LAYER == object)
@@ -381,11 +456,53 @@ void WindowManager::surfaceCallbackFunction_non_static(t_ilm_surface surface,
     if (ILM_NOTIFICATION_CONTENT_AVAILABLE & mask)
     {
         qDebug("ILM_NOTIFICATION_CONTENT_AVAILABLE");
-        //updateScreen();
+        /* add surface to layer for the application */
+
+        ilmErrorTypes result;
+        pid_t pid = surfaceProperties->creatorPid;
+
+        QMap<pid_t, t_ilm_layer>::const_iterator i = m_appLayers.find(pid);
+        if (i != m_appLayers.end()) {
+            t_ilm_layer layer_id = m_appLayers.value(pid);
+
+            result = ilm_layerAddSurface(layer_id, surface);
+
+            if (result != ILM_SUCCESS) {
+                qDebug("ilm_layerAddSurface(%d,%d) failed.", layer_id, surface);
+            }
+
+            /* Dirty hack! cut & paste from HomeScreen/src/layouthandler.cpp */
+            const int SCREEN_WIDTH = 1080;
+            const int SCREEN_HEIGHT = 1920;
+
+            const int TOPAREA_HEIGHT = 218;
+            const int TOPAREA_WIDTH = SCREEN_WIDTH;
+            const int TOPAREA_X = 0;
+            const int TOPAREA_Y = 0;
+            const int MEDIAAREA_HEIGHT = 215;
+            const int MEDIAAREA_WIDTH = SCREEN_WIDTH;
+            const int MEDIAAREA_X = 0;
+            const int MEDIAAREA_Y = SCREEN_HEIGHT - MEDIAAREA_HEIGHT;
+
+            ilm_surfaceSetDestinationRectangle(surface,
+                                               0,
+                                               TOPAREA_HEIGHT,
+                                               SCREEN_WIDTH,
+                                               SCREEN_HEIGHT - TOPAREA_HEIGHT - MEDIAAREA_HEIGHT);
+
+            ilm_commitChanges();
+        } else {
+            qDebug("No layer for application(pid=%d)", surfaceProperties->creatorPid);
+        }
     }
     if (ILM_NOTIFICATION_CONTENT_REMOVED & mask)
     {
         qDebug("ILM_NOTIFICATION_CONTENT_REMOVED");
+
+        /* application being down */
+        m_appLayers.remove(surfaceProperties->creatorPid);
+
+        updateScreen();
     }
     if (ILM_NOTIFICATION_CONFIGURED & mask)
     {
@@ -400,7 +517,8 @@ void WindowManager::surfaceCallbackFunction_non_static(t_ilm_surface surface,
                                       surfaceProperties->origSourceWidth,
                                       surfaceProperties->origSourceHeight);
 
-        ilm_commitChanges();
+        ilm_surfaceSetVisibility(surface, ILM_TRUE);
+
         updateScreen();
     }
 }
@@ -491,6 +609,7 @@ QList<Layout> WindowManager::getAllLayouts()
     return m_layouts;
 }
 
+#if 0
 QList<int> WindowManager::getAllSurfacesOfProcess(int pid)
 {
     QList<int> result;
@@ -508,6 +627,7 @@ QList<int> WindowManager::getAllSurfacesOfProcess(int pid)
 #endif
     return result;
 }
+#endif
 
 QList<int> WindowManager::getAvailableLayouts(int numberOfAppSurfaces)
 {
@@ -528,12 +648,14 @@ QList<int> WindowManager::getAvailableLayouts(int numberOfAppSurfaces)
     return result;
 }
 
+#if 0
 QList<int> WindowManager::getAvailableSurfaces()
 {
     qDebug("-=[getAvailableSurfaces]=-");
 
     return m_appSurfaces;
 }
+#endif
 
 QString WindowManager::getLayoutName(int layoutId)
 {
@@ -560,23 +682,25 @@ void WindowManager::hideLayer(int layer)
     qDebug("layer %d", layer);
 
 #ifdef HAVE_IVI_LAYERMANAGEMENT_API
-    if (0 == layer)
-    {
-        ilm_layerSetVisibility(WINDOWMANAGER_LAYER_POPUP, ILM_FALSE);
-    }
-    if (1 == layer)
-    {
-        ilm_layerSetVisibility(WINDOWMANAGER_LAYER_HOMESCREEN_OVERLAY, ILM_FALSE);
-    }
-    if (2 == layer)
-    {
-        ilm_layerSetVisibility(WINDOWMANAGER_LAYER_APPLICATIONS, ILM_FALSE);
-    }
-    if (3 == layer)
-    {
-        ilm_layerSetVisibility(WINDOWMANAGER_LAYER_HOMESCREEN, ILM_FALSE);
+    // POPUP=0, HOMESCREEN_OVERLAY=1, APPS=2, HOMESCREEN=3
+    if (layer >= 0 && layer < WINDOWMANAGER_LAYER_NUM) {
+        /* hide target layer */
+        m_showLayers[layer] = 0;
+
+        if (layer == WINDOWMANAGER_LAYER_APPLICATIONS) {
+            /* clear pending flag */
+            m_pending_to_show = -1;
+        } else if (m_pending_to_show != -1) {
+            /* there is a pending application to show */
+            showAppLayer(m_pending_to_show);
+            return;
+        }
+
+        t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
+        int num_layers = getLayerRenderOrder(renderOrder);
+        ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
+        ilm_commitChanges();
     }
-    ilm_commitChanges();
 #endif
 }
 
@@ -639,22 +763,57 @@ void WindowManager::showLayer(int layer)
     qDebug("layer %d", layer);
 
 #ifdef HAVE_IVI_LAYERMANAGEMENT_API
-    if (0 == layer)
-    {
-        ilm_layerSetVisibility(WINDOWMANAGER_LAYER_POPUP, ILM_TRUE);
-    }
-    if (1 == layer)
-    {
-        ilm_layerSetVisibility(WINDOWMANAGER_LAYER_HOMESCREEN_OVERLAY, ILM_TRUE);
+    // POPUP=0, HOMESCREEN_OVERLAY=1, APPS=2, HOMESCREEN=3
+    if (layer >= 0 && layer < WINDOWMANAGER_LAYER_NUM) {
+        static const int layer_id_array[] = {
+            WINDOWMANAGER_LAYER_POPUP,
+            WINDOWMANAGER_LAYER_HOMESCREEN_OVERLAY,
+            WINDOWMANAGER_LAYER_APPLICATIONS,
+            WINDOWMANAGER_LAYER_HOMESCREEN,
+        };
+
+        m_showLayers[layer] = layer_id_array[layer];
+
+        t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
+        int num_layers = getLayerRenderOrder(renderOrder);
+        ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
+        ilm_commitChanges();
     }
-    if (2 == layer)
-    {
-        ilm_layerSetVisibility(WINDOWMANAGER_LAYER_APPLICATIONS, ILM_TRUE);
+#endif
+}
+
+void WindowManager::showAppLayer(int pid)
+{
+    qDebug("-=[showAppLayer]=-");
+    qDebug("pid %d", pid);
+
+    if (pid == -1) {
+        /* nothing to show */
+        return;
     }
-    if (3 == layer)
-    {
-        ilm_layerSetVisibility(WINDOWMANAGER_LAYER_HOMESCREEN, ILM_TRUE);
+#ifdef HAVE_IVI_LAYERMANAGEMENT_API
+
+    /* clear pending flag */
+    m_pending_to_show = -1;
+
+    /* search layer id for application to show */
+    QMap<pid_t, t_ilm_layer>::const_iterator i = m_appLayers.find(pid);
+
+    if (i != m_appLayers.end()) {
+        m_showLayers[2] = m_appLayers.value(pid);
+        qDebug("Found layer(%d) to show for app(pid=%d)", m_showLayers[2], pid);
+    } else {
+        /* Probably app layer hasn't been made yet */
+        m_pending_to_show = pid;
+        /* hide current app once, back to default screen */
+        m_showLayers[2] = 0;
+
+        qDebug("No layer to show for app(pid=%d)", pid);
     }
+    t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
+
+    int num_layers = getLayerRenderOrder(renderOrder);
+    ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
     ilm_commitChanges();
 #endif
 }