Fix output debug message
[apps/agl-service-windowmanager.git] / src / wm_layer_control.cpp
index 1d591f0..acf41f6 100644 (file)
@@ -23,7 +23,8 @@
 
 #define LC_AREA_PATH "/etc/areas.db"
 #define LC_LAYER_SETTING_PATH "/etc/layers_setting.json"
-#define LC_DEFAULT_AREA "normal.full"
+#define LC_DEFAULT_AREA "fullscreen"
+#define BACK_GROUND_LAYER "BackGroundLayer"
 
 using std::string;
 using std::vector;
@@ -122,14 +123,14 @@ void LayerControl::createNewLayer(unsigned id)
     HMI_INFO("create new ID :%d", id);
     struct rect rct = this->area2size[LC_DEFAULT_AREA];
     ilm_layerCreateWithDimension(&id, rct.w, rct.h);
-    ilm_layerSetSourceRectangle(id, rct.x, rct.y, rct.w, rct.h);
+    //ilm_layerSetSourceRectangle(id, rct.x, rct.y, rct.w, rct.h);
     //ilm_layerSetDestinationRectangle(id, rct.x, rct.y, rct.w, rct.h);
     ilm_layerSetOpacity(id, 1.0);
     ilm_layerSetVisibility(id, ILM_FALSE);
     ilm_commitChanges();
     auto wm_layer = getWMLayer(id);
-    wm_layer->addLayer(id);
-    this->commitChange();
+    wm_layer->addLayerToState(id);
+    this->renderLayers();
 }
 
 unsigned LayerControl::getNewLayerID(const string& role, string* layer_name)
@@ -155,12 +156,24 @@ shared_ptr<WMLayer> LayerControl::getWMLayer(unsigned layer)
     return this->wm_layers[uuid];
 }
 
+std::shared_ptr<WMLayer> LayerControl::getWMLayer(std::string layer_name)
+{
+    for(auto &l : this->wm_layers)
+    {
+        if(l->layerName() == layer_name)
+        {
+            return l;
+        }
+    }
+    return nullptr;
+}
+
 struct rect LayerControl::getAreaSize(const std::string& area)
 {
     return area2size[area];
 }
 
-void LayerControl::setupArea(double scaling)
+void LayerControl::setupArea(const rectangle& base_rct, double scaling)
 {
     struct rect rct;
     this->scaling = scaling;
@@ -171,8 +184,8 @@ void LayerControl::setupArea(double scaling)
 
     for (auto &i : this->area2size)
     {
-        i.second.x = static_cast<int>(scaling * i.second.x + 0.5);
-        i.second.y = static_cast<int>(scaling * i.second.y + 0.5);
+        i.second.x = base_rct.left() + static_cast<int>(scaling * i.second.x + 0.5);
+        i.second.y = base_rct.top() + static_cast<int>(scaling * i.second.y + 0.5);
         i.second.w = static_cast<int>(scaling * i.second.w + 0.5);
         i.second.h = static_cast<int>(scaling * i.second.h + 0.5);
 
@@ -196,7 +209,7 @@ WMError LayerControl::updateLayer(LayerState& layer_state)
     return WMError::SUCCESS;
 }
 
-WMError LayerControl::commitChange()
+WMError LayerControl::renderLayers()
 {
     HMI_INFO("Commit change");
     WMError rc = WMError::SUCCESS;
@@ -204,8 +217,10 @@ WMError LayerControl::commitChange()
     for(auto& l : this->wm_layers)
     {
         auto state = l->getLayerState();
+        HMI_DEBUG("layer %s", l->layerName().c_str());
         for(const auto& id : state.getIviIdList())
         {
+            HMI_DEBUG("Add %d", id);
             ivi_l_ids.push_back(id);
         }
     }
@@ -220,7 +235,6 @@ WMError LayerControl::commitChange()
     for(const auto& i : ivi_l_ids)
     {
         id_array[count] = i;
-        HMI_DEBUG("check render order %d", i);
         ++count;
     }
 
@@ -230,6 +244,13 @@ WMError LayerControl::commitChange()
         this->undoUpdate();
         rc = WMError::FAIL;
     }
+    else
+    {
+        for(auto& l : this->wm_layers)
+        {
+            l->commitChange();
+        }
+    }
     ilm_commitChanges();
     delete id_array;
     return rc;
@@ -341,7 +362,6 @@ WMError LayerControl::loadAreaDb(const std::string& path)
 
 WMError LayerControl::layoutChange(const WMAction& action)
 {
-    WMError ret = WMError::FAIL;
     if (action.visible == TaskVisible::INVISIBLE)
     {
         // Visibility is not change -> no redraw is required
@@ -357,20 +377,24 @@ WMError LayerControl::layoutChange(const WMAction& action)
     // Layout Manager
     // WMError ret = this->setLayerSize(layer, action.area);
     auto rect = this->getAreaSize(action.area);
-    ilmErrorTypes err = ilm_layerSetDestinationRectangle(layer, rect.x, rect.y, rect.w, rect.h);
+    HMI_DEBUG("Set layout %d, %d, %d, %d",rect.x, rect.y, rect.w, rect.h);
+    ilm_layerSetSourceRectangle(layer, 0, 0, rect.w, rect.h);
+    ilm_commitChanges();
+    ilm_layerSetDestinationRectangle(layer, rect.x, rect.y, rect.w, rect.h);
+    ilm_commitChanges();
     for(auto &wm_layer: this->wm_layers)
     {
         if(wm_layer->hasLayerID(layer))
         {
+            wm_layer->setAreaToState(action.client->appID(), action.area);
+            /* TODO: manipulate state directly
             LayerState ls = wm_layer->getLayerState();
             ls.setArea(action.client->appID(), action.area);
+            wm_layer->dump(); */
         }
     }
-    if(err == ILM_SUCCESS)
-    {
-        ret = WMError::SUCCESS;
-    }
-    return ret;
+
+    return WMError::SUCCESS;
 }
 
 WMError LayerControl::visibilityChange(const WMAction& action)
@@ -382,11 +406,11 @@ WMError LayerControl::visibilityChange(const WMAction& action)
         return WMError::NOT_REGISTERED;
     }
 
-    if (action.visible != TaskVisible::INVISIBLE)
+    if (action.visible == TaskVisible::VISIBLE)
     {
         ret = this->makeVisible(action.client);
     }
-    else
+    else if (action.visible == TaskVisible::INVISIBLE)
     {
         ret = this->makeInvisible(action.client);
     }
@@ -406,12 +430,11 @@ void LayerControl::dispatchCreateEvent(ilmObjectType object, unsigned id, bool c
                 return;
             this->cb.surfaceCreated(sp.creatorPid, id);
             ilm_surfaceAddNotification(id, surfaceCallback_static);
-            ilm_surfaceSetSourceRectangle(id, 0, 0, sp.origSourceWidth, sp.origSourceHeight);
             ilm_surfaceSetVisibility(id, ILM_TRUE);
         }
         else
         {
-            // this->cb->surfaceDestroyed(id);
+            this->cb.surfaceDestroyed(id);
         }
     }
     if (ILM_LAYER == object)
@@ -463,6 +486,9 @@ void LayerControl::dispatchPropertyChangeEvent(unsigned id,
     }
     if (ILM_NOTIFICATION_CONFIGURED & mask)
     {
+        HMI_DEBUG("surface %d available", id);
+        ilm_surfaceSetSourceRectangle(id, 0, 0, sprop->origSourceWidth, sprop->origSourceHeight);
+        ilm_surfaceSetDestinationRectangle(id, 0, 0, sprop->origSourceWidth, sprop->origSourceHeight);
         /* qDebug("ILM_NOTIFICATION_CONFIGURED");
         qDebug("  surfaceProperties %d", surface);
         qDebug("    surfaceProperties.origSourceWidth: %d", surfaceProperties->origSourceWidth);
@@ -557,17 +583,21 @@ WMError LayerControl::makeVisible(const shared_ptr<WMClient> client)
     // Don't check here the client is not nullptr
     unsigned layer = client->layerID();
 
-    for(auto& wm_layer : this->wm_layers)
+    this->moveForeGround(client);
+
+    ilm_layerSetVisibility(layer, ILM_TRUE);
+
+    /* for(auto& wm_layer : this->wm_layers)
     {
         if(wm_layer->hasLayerID(layer))
         {
             LayerState ls = wm_layer->getLayerState();
             ls.addLayer(layer);;
         }
-    }
+    } */
 
     // Move foreground from back ground layer
-    for(auto& wm_layer : this->wm_layers)
+    /* for(auto& wm_layer : this->wm_layers)
     {
         if(wm_layer->layerName() == "BackGroundLayer")
         {
@@ -578,7 +608,7 @@ WMError LayerControl::makeVisible(const shared_ptr<WMClient> client)
             }
             break;
         }
-    }
+    } */
 
     return ret;
 }
@@ -586,32 +616,87 @@ WMError LayerControl::makeVisible(const shared_ptr<WMClient> client)
 WMError LayerControl::makeInvisible(const shared_ptr<WMClient> client)
 {
     WMError ret = WMError::SUCCESS;
-    // Don't check here the client is not nullptr
-    unsigned layer = client->layerID();
+    unsigned layer = client->layerID(); // Don't check here the client is not nullptr
+
+    bool mv_ok = this->moveBackGround(client);
+
+    if(!mv_ok)
+    {
+        HMI_INFO("make invisible client %s", client->appID().c_str());
+        ilm_layerSetVisibility(layer, ILM_FALSE);
+    }
 
-    for(auto& wm_layer : this->wm_layers)
+    //ilm_layerSetDestinationRectangle(layer, 0, 0, 0, 0);
+
+    /* for(auto& wm_layer : this->wm_layers)
     {
         if(wm_layer->hasLayerID(layer))
         {
             LayerState ls = wm_layer->getLayerState();
             ls.removeLayer(layer);;
         }
-    }
+    } */
 
-    // Move foreground from back ground layer
-    for(auto& wm_layer : this->wm_layers)
+
+
+    return ret;
+}
+
+bool LayerControl::moveBackGround(const shared_ptr<WMClient> client)
+{
+    bool ret = false;
+
+    // Move background from foreground layer
+    auto bg = this->getWMLayer(BACK_GROUND_LAYER);
+    if(bg != nullptr)
     {
-        if(wm_layer->layerName() == "BackGroundLayer")
+        HMI_DEBUG("client %s role %s", client->appID().c_str(), client->role().c_str());
+        unsigned layer = client->layerID();
+        if(bg->hasRole(client->role()))
         {
-            if(wm_layer->hasRole(client->role()))
-            {
-                LayerState ls = wm_layer->getLayerState();
-                ls.addLayer(layer);
-            }
-            break;
+            HMI_INFO("%s go to background", client->appID().c_str());
+            bg->addLayerToState(layer);
+            auto wm_layer = this->getWMLayer(layer);
+            wm_layer->removeLayerFromState(layer);
+            /* TODO: manipulate state directly
+            LayerState bg_ls = bg->getLayerState();
+            bg_ls.addLayer(layer);
+            LayerState ls = wm_layer->getLayerState();
+            ls.removeLayer(layer); */
+            bg->dump();
+            wm_layer->dump();
+            ret = true;
         }
     }
+    return ret;
+}
+
+bool LayerControl::moveForeGround(const shared_ptr<WMClient> client)
+{
+    bool ret = false;
 
+    // Move foreground from foreground layer
+    auto bg = this->getWMLayer(BACK_GROUND_LAYER);
+    if(bg != nullptr)
+    {
+        if(bg->hasRole(client->role()))
+        {
+            unsigned layer = client->layerID();
+            HMI_INFO("%s go to foreground", client->appID().c_str());
+            bg->removeLayerFromState(layer);
+            auto wm_layer = this->getWMLayer(layer);
+            wm_layer->addLayerToState(layer);
+            /* TODO: manipulate state directly
+            LayerState bg_ls = bg->getLayerState();
+            bg_ls.removeLayer(layer);
+            LayerState ls = wm_layer->getLayerState();
+            ls.addLayer(layer); */
+            bg->dump();
+            wm_layer->dump();
+            ret = true;
+        }
+    }
     return ret;
 }
+
 } // namespace wm
\ No newline at end of file