Add permission to use display
[apps/agl-service-windowmanager.git] / src / wm_layer_control.cpp
index c76a070..c5c7913 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 2018 Konsulko Group
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,8 +22,8 @@
 #include "request.hpp"
 #include "json_helper.hpp"
 
-#define LC_AREA_PATH "/etc/areas.db"
-#define LC_LAYER_SETTING_PATH "/etc/layers.json"
+#define LC_AREA_FILE "areas.json"
+#define LC_LAYER_SETTING_FILE "layers.json"
 #define LC_DEFAULT_AREA "fullscreen"
 #define BACK_GROUND_LAYER "BackGroundLayer"
 
@@ -58,8 +59,8 @@ static void layerCallback_static(t_ilm_layer layer,
 
 LayerControl::LayerControl(const std::string& root)
 {
-    string area_path = root + LC_AREA_PATH;
-    string layer_path= root + LC_LAYER_SETTING_PATH;
+    string area_path(get_file_path(LC_AREA_FILE, root.c_str()));
+    string layer_path(get_file_path(LC_LAYER_SETTING_FILE, root.c_str()));
     // load layers.setting.json
     WMError ret = this->loadLayerSetting(layer_path);
     assert(ret == WMError::SUCCESS);
@@ -277,7 +278,7 @@ void LayerControl::undoUpdate()
 
 WMError LayerControl::loadLayerSetting(const string &path)
 {
-    HMI_DEBUG("loading WMLayer(Application Containers) Setting from %s", path);
+    HMI_DEBUG("loading WMLayer(Application Containers) Setting from %s", path.c_str());
 
     json_object *json_obj, *json_cfg;
     int ret = jh::inputJsonFilie(path.c_str(), &json_obj);
@@ -393,10 +394,26 @@ WMError LayerControl::layoutChange(const WMAction& action)
     unsigned surface = action.client->surfaceID();
 
     auto rect = this->getAreaSize(action.area);
-    HMI_DEBUG("Set layout %d, %d, %d, %d",rect.x, rect.y, rect.w, rect.h);
-    ilm_commitChanges();
+    HMI_SEQ_INFO(action.req_num, "Set layout %d, %d, %d, %d",rect.x, rect.y, rect.w, rect.h);
+
+    // Sometimes, ivi_wm_surface_size signal doesn't reach window manager,
+    // then, Window Manager set set source size = 0.
+    if(!action.client->isSourceSizeSet())
+    {
+        ilmSurfaceProperties sp;
+        ilm_getPropertiesOfSurface(surface, &sp);
+        if((sp.origSourceHeight != sp.sourceHeight) || (sp.origSourceWidth != sp.sourceWidth))
+        {
+            HMI_SEQ_NOTICE(action.req_num, "set source size w:%d h%d", sp.origSourceWidth, sp.origSourceHeight);
+            ilm_surfaceSetSourceRectangle(surface, 0, 0, sp.origSourceWidth, sp.origSourceHeight);
+            ilm_commitChanges();
+            action.client->setSurfaceSizeCorrectly();
+        }
+    }
+
     ilm_surfaceSetDestinationRectangle(surface, rect.x, rect.y, rect.w, rect.h);
     ilm_commitChanges();
+    action.client->setArea(action.area);
     for(auto &wm_layer: this->wm_layers)
     {
         // Store the state who is assigned to the area
@@ -434,6 +451,48 @@ WMError LayerControl::visibilityChange(const WMAction& action)
     return ret;
 }
 
+WMError LayerControl::updateAreaList(const ChangeAreaReq& req)
+{
+    // error check
+    for(const auto& elem : req.area_req)
+    {
+        if(this->area2size.find(elem.first) == this->area2size.end())
+        {
+            HMI_ERROR("requested area %s is not registered in area list", elem.first.c_str());
+            return WMError::NOT_REGISTERED;
+        }
+    }
+    // update list
+    for(const auto& elem : req.area_req)
+    {
+        this->area2size[elem.first] = elem.second;
+    }
+    if(req.save)
+    {
+        HMI_NOTICE("Not implemented");
+        // TODO
+    }
+    return WMError::SUCCESS;
+}
+
+WMError LayerControl::getUpdateAreaList(ChangeAreaReq *req)
+{
+    for(const auto& wm_layer : this->wm_layers)
+    {
+        // get area name and compare it with elem
+        for(const auto& area : req->area_req)
+        {
+            string app = wm_layer->attachedApp(area.first);
+            if(!app.empty())
+            {
+                HMI_INFO("app %s changes area %s", app.c_str(), area.first.c_str());
+                req->update_app2area[app] = area.first;
+            }
+        }
+    }
+    return WMError::SUCCESS;
+}
+
 void LayerControl::appTerminated(const shared_ptr<WMClient> client)
 {
     for(auto& l : this->wm_layers)
@@ -625,4 +684,4 @@ bool LayerControl::moveForeGround(const shared_ptr<WMClient> client)
     return ret;
 }
 
-} // namespace wm
\ No newline at end of file
+} // namespace wm