From 7515965e55e112a4228764614bcdd3811ae44dd7 Mon Sep 17 00:00:00 2001 From: Tadao Tanikawa Date: Mon, 12 Dec 2016 16:55:58 +0900 Subject: [PATCH] Hack to fix issue of switching apps 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 --- WindowManager/src/windowmanager.cpp | 87 ++++++++++++++++++++----------------- WindowManager/src/windowmanager.hpp | 3 ++ 2 files changed, 51 insertions(+), 39 deletions(-) diff --git a/WindowManager/src/windowmanager.cpp b/WindowManager/src/windowmanager.cpp index edcbf9e..0a2a609 100644 --- a/WindowManager/src/windowmanager.cpp +++ b/WindowManager/src/windowmanager.cpp @@ -36,9 +36,15 @@ // 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 } diff --git a/WindowManager/src/windowmanager.hpp b/WindowManager/src/windowmanager.hpp index 7358412..8c8f63c 100644 --- a/WindowManager/src/windowmanager.hpp +++ b/WindowManager/src/windowmanager.hpp @@ -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 -- 2.16.6