0.9.22 release 25/19125/1
authorMasayuki Sasaki <masayuki.sasaki@mail.toyota-td.jp>
Tue, 8 Apr 2014 01:11:58 +0000 (10:11 +0900)
committerMasayuki Sasaki <masayuki.sasaki@mail.toyota-td.jp>
Tue, 8 Apr 2014 01:13:39 +0000 (10:13 +0900)
- 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 <masayuki.sasaki@mail.toyota-td.jp>
lib/common/CicoSystemConfig.cpp
lib/common/CicoSystemConfig.h
lib/system-controller/CicoSCLayer.cpp
lib/system-controller/CicoSCLayer.h
lib/system-controller/CicoSCWindowController.cpp
packaging/ico-uxf-homescreen.spec
res/org.tizen.ico.system-controller/res/config/system.xml

index 199c3d3..7da8c63 100644 (file)
@@ -1914,6 +1914,27 @@ CicoSystemConfig::getDisplayIdbyNo(int no)
  */
 //--------------------------------------------------------------------------
 int
+CicoSystemConfig::getDisplayIdbyType(int type)
+{
+    vector<CicoSCDisplayConf*>::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;
index 1b53b7d..7126c7f 100644 (file)
@@ -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);
index 49eae2f..95f4acc 100644 (file)
@@ -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;
index 299a613..b54d20a 100644 (file)
@@ -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
index d1c8e4c..cb0c2b5 100644 (file)
@@ -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);
 }
 
 //==========================================================================
index 89d7a89..358acc0 100644 (file)
@@ -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
index c8f3d72..ee597a4 100644 (file)
@@ -15,7 +15,7 @@
 <displays>
     <display id="0" name="Center">
         <node>Center</node>
-        <no>0</no>
+        <no>1</no>
         <type>center</type>
         <width>1080</width>
         <height>1920</height>
     </display>
     <display id="1" name="Mid">
         <node>Center</node>
-        <no>1</no>
-        <type>center</type>
+        <no>0</no>
+        <type>meter</type>
         <width>1280</width>
         <height>480</height>
         <layers>