Hack to fix issue of switching apps 37/7537/1
authorTadao Tanikawa <tanikawa.tadao@jp.panasonic.com>
Mon, 12 Dec 2016 07:55:58 +0000 (16:55 +0900)
committerTadao Tanikawa <tanikawa.tadao@jp.panasonic.com>
Mon, 12 Dec 2016 11:24:32 +0000 (20:24 +0900)
To switching between apps, controlling surface's
visiblity (on/off) does not work as intended.

It looks work well to set render order of layers properly.

TODO: switching between apps and navigation still doesn't
work. For develop, navigation icon is assgined to
'controls@0.1' and now, controls app doesn't make any
wl_surfaces (don't know why). Probably this causes issue
switching between apps <-> navigation.

Signed-off-by: Tadao Tanikawa <tanikawa.tadao@jp.panasonic.com>
WindowManager/src/windowmanager.cpp
WindowManager/src/windowmanager.hpp

index edcbf9e..0a2a609 100644 (file)
 // the HomeScreen app has to have the surface id 1000
 #define WINDOWMANAGER_HOMESCREEN_MAIN_SURFACE_ID 1000
 
-
 void* WindowManager::myThis = 0;
 
+static const int layer_id_array[] = {
+    WINDOWMANAGER_LAYER_POPUP,
+    WINDOWMANAGER_LAYER_HOMESCREEN_OVERLAY,
+    WINDOWMANAGER_LAYER_APPLICATIONS,
+    WINDOWMANAGER_LAYER_HOMESCREEN,
+};
+
 WindowManager::WindowManager(QObject *parent) :
     QObject(parent),
     m_layouts(),
@@ -49,6 +55,13 @@ WindowManager::WindowManager(QObject *parent) :
     m_screenWidth(0),
     m_screenHeight(0)
 {
+    m_showLayers = new int[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 */
+
     qDebug("-=[WindowManager]=-");
 }
 
@@ -97,6 +110,19 @@ WindowManager::~WindowManager()
     delete mp_layoutAreaToSurfaceIdAssignment;
 }
 
+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;
+}
+
 void WindowManager::dumpScene()
 {
     qDebug("\n");
@@ -284,12 +310,9 @@ void WindowManager::updateScreen()
 
     // 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);
+    int num_layers = getLayerRenderOrder(renderOrder);
+    ilm_displaySetRenderOrder(0, renderOrder, num_layers);
+    ilm_displaySetRenderOrder(1, renderOrder, num_layers);
     ilm_commitChanges();
 #endif
 }
@@ -560,23 +583,16 @@ 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) {
+        m_showLayers[layer] = 0;
+
+        t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
+        int num_layers = getLayerRenderOrder(renderOrder);
+        ilm_displaySetRenderOrder(0, renderOrder, num_layers);
+        ilm_displaySetRenderOrder(1, renderOrder, num_layers);
+        ilm_commitChanges();
     }
-    ilm_commitChanges();
 #endif
 }
 
@@ -639,22 +655,15 @@ 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);
-    }
-    if (2 == layer)
-    {
-        ilm_layerSetVisibility(WINDOWMANAGER_LAYER_APPLICATIONS, ILM_TRUE);
-    }
-    if (3 == layer)
-    {
-        ilm_layerSetVisibility(WINDOWMANAGER_LAYER_HOMESCREEN, ILM_TRUE);
+    // POPUP=0, HOMESCREEN_OVERLAY=1, APPS=2, HOMESCREEN=3
+    if (layer >= 0 && layer < WINDOWMANAGER_LAYER_NUM) {
+        m_showLayers[layer] = layer_id_array[layer];
+
+        t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
+        int num_layers = getLayerRenderOrder(renderOrder);
+        ilm_displaySetRenderOrder(0, renderOrder, num_layers);
+        ilm_displaySetRenderOrder(1, renderOrder, num_layers);
+        ilm_commitChanges();
     }
-    ilm_commitChanges();
 #endif
 }
index 7358412..8c8f63c 100644 (file)
@@ -49,6 +49,9 @@ private:
     unsigned int m_screenWidth;
     unsigned int m_screenHeight;
 
+    int* m_showLayers;
+    int getLayerRenderOrder(t_ilm_layer id_array[]);
+
     void dumpScene();
 
 #ifdef HAVE_IVI_LAYERMANAGEMENT_API