From db99502968ce7be963fac88ece10fa90c16e15cf Mon Sep 17 00:00:00 2001 From: Masayuki Sasaki Date: Tue, 8 Apr 2014 10:11:58 +0900 Subject: [PATCH] 0.9.22 release - bug fix: TIVI-3007 - Home button doesn't response after some operations - bug fix: Two or more Display(s) cannot be used. - bug fix: SystemController sometimes crashes at the time of deletion of Surface. Change-Id: I7d20cbaed721e509b59704f353c1d3f8f4034d59 Signed-off-by: Masayuki Sasaki --- lib/common/CicoSystemConfig.cpp | 21 ++++++ lib/common/CicoSystemConfig.h | 1 + lib/system-controller/CicoSCLayer.cpp | 27 ++++--- lib/system-controller/CicoSCLayer.h | 3 + lib/system-controller/CicoSCWindowController.cpp | 82 +++++++++++++++------- packaging/ico-uxf-homescreen.spec | 2 +- .../res/config/system.xml | 6 +- 7 files changed, 96 insertions(+), 46 deletions(-) diff --git a/lib/common/CicoSystemConfig.cpp b/lib/common/CicoSystemConfig.cpp index 199c3d3..7da8c63 100644 --- a/lib/common/CicoSystemConfig.cpp +++ b/lib/common/CicoSystemConfig.cpp @@ -1914,6 +1914,27 @@ CicoSystemConfig::getDisplayIdbyNo(int no) */ //-------------------------------------------------------------------------- int +CicoSystemConfig::getDisplayIdbyType(int type) +{ + vector::const_iterator itr; + itr = m_displayConfList.begin(); + for (; itr != m_displayConfList.end(); ++itr) { + const CicoSCDisplayConf* conf = (*itr); + if (type == conf->type) { + return conf->id; + } + } + return -1; +} + +//-------------------------------------------------------------------------- +/** + * @brief + * + * @param [in] + */ +//-------------------------------------------------------------------------- +int CicoSystemConfig::getNumberofDisplay(void) { return numDisplay; diff --git a/lib/common/CicoSystemConfig.h b/lib/common/CicoSystemConfig.h index 1b53b7d..7126c7f 100644 --- a/lib/common/CicoSystemConfig.h +++ b/lib/common/CicoSystemConfig.h @@ -108,6 +108,7 @@ public: int getNodeIdbyName(const string & name); int getDisplayIdbyName(const string & name); int getDisplayIdbyNo(int no); + int getDisplayIdbyType(int type); int getNumberofDisplay(void); int getLayerIdfbyName(const string & displayName, const string & layerName); diff --git a/lib/system-controller/CicoSCLayer.cpp b/lib/system-controller/CicoSCLayer.cpp index 49eae2f..95f4acc 100644 --- a/lib/system-controller/CicoSCLayer.cpp +++ b/lib/system-controller/CicoSCLayer.cpp @@ -30,9 +30,12 @@ CicoSCLayer::CicoSCLayer() displayid(-1), numsurfaces(0), menuoverlap(false) { - surfaceids = (int *)malloc(40 * sizeof(int)); + surfaceids = (int *)malloc(ICO_SC_LAYER_TABLE_INITIAL * sizeof(int)); if (surfaceids) { - maxsurfaces = 50; + maxsurfaces = ICO_SC_LAYER_TABLE_INITIAL; + } + else { + maxsurfaces = 0; } } @@ -64,18 +67,15 @@ CicoSCLayer::addSurface(int surfaceid, bool top) ICO_DBG("CicoSCLayer::addSurface(%08x,%d)", surfaceid, top); idx2 = 0; - for (idx = 0; idx < numsurfaces; idx++, idx2++) { - if (surfaceids[idx] == surfaceid) { - idx2 --; - } - else { - surfaceids[idx2] = surfaceids[idx]; + for (idx = 0; idx < numsurfaces; idx++) { + if (surfaceids[idx] != surfaceid) { + surfaceids[idx2++] = surfaceids[idx]; } } numsurfaces = idx2; if (numsurfaces >= maxsurfaces) { - maxsurfaces += 20; + maxsurfaces = numsurfaces + ICO_SC_LAYER_TABLE_EXTENSION; wksurfaceids = (int *)malloc(maxsurfaces * sizeof(int)); if (! wksurfaceids) { ICO_ERR("CicoSCLayer::addSurface: Out of Memory"); @@ -111,12 +111,9 @@ CicoSCLayer::removeSurface(int surfaceid) ICO_DBG("CicoSCLayer::removeSurface(%08x)", surfaceid); idx2 = 0; - for (idx = 0; idx < numsurfaces; idx++, idx2++) { - if (surfaceids[idx] == surfaceid) { - idx2 --; - } - else { - surfaceids[idx2] = surfaceids[idx]; + for (idx = 0; idx < numsurfaces; idx++) { + if (surfaceids[idx] != surfaceid) { + surfaceids[idx2++] = surfaceids[idx]; } } numsurfaces = idx2; diff --git a/lib/system-controller/CicoSCLayer.h b/lib/system-controller/CicoSCLayer.h index 299a613..b54d20a 100644 --- a/lib/system-controller/CicoSCLayer.h +++ b/lib/system-controller/CicoSCLayer.h @@ -19,6 +19,9 @@ #include "CicoCommonDef.h" +#define ICO_SC_LAYER_TABLE_INITIAL 50 // layer table initial size +#define ICO_SC_LAYER_TABLE_EXTENSION 50 // layer table extension size + //-------------------------------------------------------------------------- /** * @brief This class hold layer information diff --git a/lib/system-controller/CicoSCWindowController.cpp b/lib/system-controller/CicoSCWindowController.cpp index d1c8e4c..cb0c2b5 100644 --- a/lib/system-controller/CicoSCWindowController.cpp +++ b/lib/system-controller/CicoSCWindowController.cpp @@ -294,6 +294,12 @@ CicoSCWindowController::raiselower(CicoSCWindow *window, bool raise) int nsurf; const int *surfs = layer->getSurfaces(&nsurf); + ICO_TRA("CicoSCWindowControllerCicoSCWindowController layer.%d %d.%x %x %x %x", + window->layerid, nsurf, surfs[0], surfs[1], surfs[2], surfs[3]); + if (nsurf > 4) { + ICO_TRA("CicoSCWindowControllerCicoSCWindowController .%x %x %x %x", + surfs[4], surfs[5], surfs[6], surfs[7]); + } if (ilm_layerSetRenderOrder(window->layerid, (t_ilm_layer *)surfs, nsurf) != ILM_SUCCESS) { ICO_ERR("CicoSCWindowController::raiselower " @@ -1538,6 +1544,16 @@ CicoSCWindowController::destroySurfaceCB(void *data, return; } + // delete surface from layer + CicoSCLayer* layer = findLayer(window->displayid, window->layerid); + if (NULL == layer) { + ICO_TRA("CicoSCWindowController::destroySurfaceCB: surf.%08x not exist in layer.%d", + surfaceid, window->layerid); + } + else { + layer->removeSurface(surfaceid); + } + // send message CicoSCMessage *message = new CicoSCMessage(); message->addRootObject("command", MSG_CMD_DESTROY); @@ -1983,65 +1999,73 @@ CicoSCWindowController::wlGeniviLayerNotification(t_ilm_layer layer, void CicoSCWindowController::initializeGeniviLMS(void) { - t_ilm_uint NumberOfScreens = 16; - t_ilm_uint ScreenIds[16]; + t_ilm_uint NumberOfScreens = 0; t_ilm_layer *pLayerId, *ppLayerId; t_ilm_int LayerNumber; - t_ilm_uint *pScreenIds = ScreenIds; + t_ilm_uint *pScreenIds; struct ilmScreenProperties ScreenProperties; - int idx, idx2; + int idxs, idx1, idx2; int DisplayId, LayerId; const CicoSCDisplayConf *DisplayConf; const CicoSCLayerConf *LayerConf; // get all screen id - memset(ScreenIds, 0, sizeof(ScreenIds)); if ((ilm_getScreenIDs(&NumberOfScreens, &pScreenIds) != ILM_SUCCESS) || - (ilm_commitChanges() != ILM_SUCCESS)) { + (NumberOfScreens <= 0)) { ICO_ERR("CicoSCWindowController::initializeGeniviLMS " - "ilm_getScreenIDs() Error"); + "ilm_getScreenIDs() Error(num=%d)", NumberOfScreens); return; } - ICO_TRA("initializeGeniviLMS: Screens=%d.%x %x %x %x", - NumberOfScreens, ScreenIds[0], ScreenIds[1], ScreenIds[2], ScreenIds[3]); + ICO_TRA("initializeGeniviLMS: Screens=%d.%x %x", NumberOfScreens, pScreenIds[0], + NumberOfScreens >= 2 ? pScreenIds[1] : 0); if ((int)NumberOfScreens > CicoSystemConfig::getInstance()->getNumberofDisplay()) { + ICO_WRN("CicoSCWindowController::initializeGeniviLMS # of screens physical=%d config=%d", + NumberOfScreens, CicoSystemConfig::getInstance()->getNumberofDisplay()); NumberOfScreens = (t_ilm_uint)CicoSystemConfig::getInstance()->getNumberofDisplay(); } - for (idx = 0; idx < (int)NumberOfScreens; idx++) { - ICO_TRA("CicoSCWindowController::initializeGeniviLMS: " - "call ilm_getPropertiesOfScreen(%x)", ScreenIds[idx]); - if ((ilm_getPropertiesOfScreen(ScreenIds[idx], &ScreenProperties) != ILM_SUCCESS) || - (ilm_commitChanges() != ILM_SUCCESS)) { +#if 1 /* At present, GENIVI (ivi-controller) is processing only one Display */ + for (idxs = (int)NumberOfScreens - 1; idxs >= 0; idxs--) +#else + for (idxs = 0; idxs < (int)NumberOfScreens; idxs++) +#endif + { + if (ilm_getPropertiesOfScreen(pScreenIds[idxs], &ScreenProperties) != ILM_SUCCESS) { ICO_ERR("CicoSCWindowController::initializeGeniviLMS " - "ilm_getPropertiesOfScreen(%d.%x) Error", idx, ScreenIds[idx]); + "ilm_getPropertiesOfScreen(%d.%x) Error", idxs, pScreenIds[idxs]); continue; } + // It is referred to as Center when there is only one display + if (NumberOfScreens == 1) { + DisplayId = CicoSystemConfig::getInstance()->getDisplayIdbyType(ICO_NODETYPE_CENTER); + } + else { + DisplayId = CicoSystemConfig::getInstance()->getDisplayIdbyNo((int)pScreenIds[idxs]); + } ICO_TRA("CicoSCWindowController::initializeGeniviLMS: " - "Screen[%d.%x] w/h=%d/%d layers=%d", - idx, ScreenIds[idx], ScreenProperties.screenWidth, - ScreenProperties.screenHeight, ScreenProperties.layerCount); + "Screen[%d.%x] w/h=%d/%d layers=%d DisplayId=%d", + idxs, pScreenIds[idxs], ScreenProperties.screenWidth, + ScreenProperties.screenHeight, ScreenProperties.layerCount, DisplayId); - DisplayId = CicoSystemConfig::getInstance()->getDisplayIdbyNo((int)ScreenIds[idx]); if ((DisplayId < 0) || ((DisplayConf = CicoSystemConfig::getInstance()->findDisplayConfbyId(DisplayId)) == NULL)) { ICO_ERR("CicoSCWindowController::initializeGeniviLMS " - "ScreenId.%x not found", ScreenIds[idx]); + "ScreenId.%x not found", pScreenIds[idxs]); } else { // set genivi layers - for (idx = 0; ; idx++) { + for (idx1 = 0; ; idx1++) { LayerConf = CicoSystemConfig::getInstance()-> - findLayerConfbyIdx(DisplayId, idx); + findLayerConfbyIdx(DisplayId, idx1); if (! LayerConf) break; } - pLayerId = (t_ilm_layer *)malloc(sizeof(t_ilm_layer) * idx); + pLayerId = (t_ilm_layer *)malloc(sizeof(t_ilm_layer) * idx1); ppLayerId = pLayerId; LayerNumber = 0; - for (idx = 0; ; idx++) { + for (idx1 = 0; ; idx1++) { LayerConf = CicoSystemConfig::getInstance()-> - findLayerConfbyIdx(DisplayId, idx); + findLayerConfbyIdx(DisplayId, idx1); if (! LayerConf) break; LayerId = LayerConf->id + DisplayId * ICO_SC_LAYERID_SCREENBASE; @@ -2101,7 +2125,10 @@ CicoSCWindowController::initializeGeniviLMS(void) } } if (LayerNumber > 0) { - if (ilm_displaySetRenderOrder(ScreenIds[idx], pLayerId, LayerNumber) + ICO_TRA("initializeGeniviLMS: layers %d.%d %d %d %d set to screen %x", + LayerNumber, pLayerId[0], pLayerId[1], pLayerId[2], pLayerId[3], + pScreenIds[idxs]); + if (ilm_displaySetRenderOrder(pScreenIds[idxs], pLayerId, LayerNumber) != ILM_SUCCESS) { ICO_ERR("CicoSCWindowController::initializeGeniviLMS " "ilm_displaySetRenderOrder(%d) Error", LayerNumber); @@ -2111,7 +2138,7 @@ CicoSCWindowController::initializeGeniviLMS(void) "ilm_commitChanges() Error"); } ppLayerId = pLayerId; - for (idx = 0; idx < LayerNumber; idx++) { + for (idx2 = 0; idx2 < LayerNumber; idx2++) { if (ilm_layerAddNotification(*ppLayerId, wlGeniviLayerNotification) != ILM_SUCCESS) { ICO_ERR("CicoSCWindowController::initializeGeniviLMS " @@ -2123,6 +2150,7 @@ CicoSCWindowController::initializeGeniviLMS(void) free(pLayerId); } } + free(pScreenIds); } //========================================================================== diff --git a/packaging/ico-uxf-homescreen.spec b/packaging/ico-uxf-homescreen.spec index 89d7a89..358acc0 100644 --- a/packaging/ico-uxf-homescreen.spec +++ b/packaging/ico-uxf-homescreen.spec @@ -1,6 +1,6 @@ Name: ico-uxf-homescreen Summary: Sample homescreen and system controller -Version: 0.9.21 +Version: 0.9.22 Release: 1.1 Group: Graphics & UI Framework/Automotive UI License: Apache-2.0 diff --git a/res/org.tizen.ico.system-controller/res/config/system.xml b/res/org.tizen.ico.system-controller/res/config/system.xml index c8f3d72..ee597a4 100644 --- a/res/org.tizen.ico.system-controller/res/config/system.xml +++ b/res/org.tizen.ico.system-controller/res/config/system.xml @@ -15,7 +15,7 @@ Center - 0 + 1 center 1080 1920 @@ -143,8 +143,8 @@ Center - 1 - center + 0 + meter 1280 480 -- 2.7.4