From dd72b1c91895058d14bd13c3aa9a50bd75f633b6 Mon Sep 17 00:00:00 2001 From: Yuta Doi Date: Fri, 29 Jun 2018 09:31:46 +0900 Subject: [PATCH] Add configuration file for each area sizes Add areas.db which has each area sizes. less-than-0 values refer to (MAX + 1 - $VALUE) and MAX is either screen width or height. layers.json had each area sizes until now, so removed the sizes from it. Change-Id: I5cf283581daaca41e2b9e3ee6e947478bff1189c Signed-off-by: Yuta Doi --- layers.json | 4 - layers.json.split | 4 - src/CMakeLists.txt | 1 + src/db/areas.db | 85 +++++++++++++++++ src/json_helper.cpp | 12 +++ src/json_helper.hpp | 1 + src/layers.cpp | 247 ++++++++++++++++++++++++++++++++++++++----------- src/layers.hpp | 3 + src/window_manager.cpp | 12 +-- 9 files changed, 297 insertions(+), 72 deletions(-) create mode 100644 src/db/areas.db diff --git a/layers.json b/layers.json index 3cfc9e5..263ab09 100644 --- a/layers.json +++ b/layers.json @@ -11,28 +11,24 @@ "role": "BackGroundLayer", "name": "BackGroundLayer", "layer_id": 999, - "area": { "type": "rect", "rect": { "x": 0, "y": 218, "width": -1, "height": -433 } }, "comment": "Single BackGround layer map for the Navigation, Radio and MediaPlayer" }, { "role": "homescreen", "name": "HomeScreen", "layer_id": 1000, - "area": { "type": "full" }, "comment": "Single layer map for the HomeScreen" }, { "role": "music|video|browser|radio|phone|map|hvac|settings|dashboard|poi|mixer|sdl|launcher|fallback", "name": "apps", "layer_id": 1001, - "area": { "type": "rect", "rect": { "x": 0, "y": 218, "width": -1, "height": -433 } }, "comment": "Range of IDs that will always be placed on layer 1001, negative rect values are interpreted as output_size.dimension - $value" }, { "role": "^on_screen.*", "name": "popups", "layer_id": 9999, - "area": { "type": "rect", "rect": { "x": 0, "y": 760, "width": -1, "height": 400 } }, "comment": "Range of IDs that will always be placed on the popup layer, that gets a very high 'dummy' id of 9999" } ] diff --git a/layers.json.split b/layers.json.split index 79026af..8115393 100644 --- a/layers.json.split +++ b/layers.json.split @@ -11,21 +11,18 @@ "role": "BackGroundLayer", "name": "BackGroundLayer", "layer_id": 999, - "area": { "type": "rect", "rect": { "x": 0, "y": 218, "width": -1, "height": -433 } }, "comment": "Single BackGround layer map for the Navigation, Radio and MediaPlayer" }, { "role": "homescreen", "name": "HomeScreen", "layer_id": 1000, - "area": { "type": "full" }, "comment": "Single layer map for the HomeScreen" }, { "role": "music|video|browser|radio|phone|map|hvac|settings|dashboard|poi|mixer|sdl|launcher|fallback", "name": "apps", "layer_id": 1001, - "area": { "type": "rect", "rect": { "x": 0, "y": 218, "width": -1, "height": -433 } }, "comment": "Range of IDs that will always be placed on layer 1001, negative rect values are interpreted as output_size.dimension - $value", "split_layouts": [ @@ -41,7 +38,6 @@ "role": "^on_screen.*", "name": "popups", "layer_id": 9999, - "area": { "type": "rect", "rect": { "x": 0, "y": 760, "width": -1, "height": 400 } }, "comment": "Range of IDs that will always be placed on the popup layer, that gets a very high 'dummy' id of 9999" } ] diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d3b1c22..42b81b7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -111,6 +111,7 @@ add_custom_command(TARGET ${TARGETS_WM} POST_BUILD COMMAND mkdir -p ${PROJECT_BINARY_DIR}/package/root/etc COMMAND cp -f ${PROJECT_SOURCE_DIR}/layers.json ${PROJECT_BINARY_DIR}/package/root/etc COMMAND cp -f ${PROJECT_SOURCE_DIR}/src/db/old_roles.db ${PROJECT_BINARY_DIR}/package/root/etc + COMMAND cp -f ${PROJECT_SOURCE_DIR}/src/db/areas.db ${PROJECT_BINARY_DIR}/package/root/etc ) add_custom_target(package DEPENDS ${PROJECT_BINARY_DIR}/package/root diff --git a/src/db/areas.db b/src/db/areas.db new file mode 100644 index 0000000..6c79bbf --- /dev/null +++ b/src/db/areas.db @@ -0,0 +1,85 @@ +{ + "areas": [ + { + "name": "fullscreen", + "rect": { + "x": 0, + "y": 0, + "w": -1, + "h": -1 + } + }, + { + "name": "normal.full", + "rect": { + "x": 0, + "y": 218, + "w": -1, + "h": -433 + } + }, + { + "name": "split.main", + "rect": { + "x": 0, + "y": 218, + "w": -1, + "h": 744 + } + }, + { + "name": "split.sub", + "rect": { + "x": 0, + "y": 962, + "w": -1, + "h": 744 + } + }, + { + "name": "software_keyboard", + "rect": { + "x": 0, + "y": 962, + "w": -1, + "h": 744 + } + }, + { + "name": "restriction.normal", + "rect": { + "x": 0, + "y": 218, + "w": -1, + "h": -433 + } + }, + { + "name": "restriction.split.main", + "rect": { + "x": 0, + "y": 218, + "w": -1, + "h": 744 + } + }, + { + "name": "restriction.split.sub", + "rect": { + "x": 0, + "y": 962, + "w": -1, + "h": 744 + } + }, + { + "name": "on_screen", + "rect": { + "x": 0, + "y": 218, + "w": -1, + "h": -433 + } + } + ] +} diff --git a/src/json_helper.cpp b/src/json_helper.cpp index 43440db..c2f4173 100644 --- a/src/json_helper.cpp +++ b/src/json_helper.cpp @@ -124,6 +124,18 @@ const char* getStringFromJson(json_object* obj, const char* key) return json_object_get_string(tmp); } +int getIntFromJson(json_object *obj, const char *key) +{ + json_object *tmp; + if (!json_object_object_get_ex(obj, key, &tmp)) + { + HMI_DEBUG("wm:jh", "Not found key \"%s\"", key); + return 0; + } + + return json_object_get_int(tmp); +} + int inputJsonFilie(const char* file, json_object** obj) { const int input_size = 128; diff --git a/src/json_helper.hpp b/src/json_helper.hpp index 38b3c8c..2f6b817 100644 --- a/src/json_helper.hpp +++ b/src/json_helper.hpp @@ -29,6 +29,7 @@ json_object *to_json(std::vector const &v); namespace jh { const char* getStringFromJson(json_object* obj, const char* key); +int getIntFromJson(json_object *obj, const char *key); int inputJsonFilie(const char* file, json_object** obj); } // namespace jh diff --git a/src/layers.cpp b/src/layers.cpp index 27fc53e..6ffb4e2 100644 --- a/src/layers.cpp +++ b/src/layers.cpp @@ -17,6 +17,7 @@ #include #include "layers.hpp" +#include "json_helper.hpp" #include "hmi-debug.h" namespace wm @@ -29,17 +30,6 @@ layer::layer(nlohmann::json const &j) this->role = j["role"]; this->name = j["name"]; this->layer_id = j["layer_id"]; - this->rect = compositor::full_rect; - if (j["area"]["type"] == "rect") - { - auto jr = j["area"]["rect"]; - this->rect = compositor::rect{ - jr["width"], - jr["height"], - jr["x"], - jr["y"], - }; - } // Init flag of normal layout only this->is_normal_layout_only = true; @@ -194,51 +184,29 @@ json layer_map::to_json() const void layer_map::setupArea(int output_w, int output_h) { compositor::rect rct; - // setup normal.full - std::string area = "normal.full"; - std::string role = "fallback"; - auto l_id = this->get_layer_id(role); - auto l = this->get_layer(*l_id); - rct = l->rect; - if(rct.w < 0) - rct.w = output_w + 1 + rct.w; - if(rct.h < 0) - rct.h = output_h + 1 + rct.h; - this->area2size[area] = rct; + for (auto &i : this->area2size) + { + rct = i.second; + + // less-than-0 values refer to MAX + 1 - $VALUE + // e.g. MAX is either screen width or height + if(rct.w < 0) + rct.w = output_w + 1 + rct.w; + if(rct.h < 0) + rct.h = output_h + 1 + rct.h; + + i.second = rct; + } + + rct = this->area2size["normal.full"]; this->area2size["normalfull"] = rct; this->area2size["normal"] = rct; - // setup split.main - area = "split.main"; - rct.h = rct.h / 2; - this->area2size[area] = rct; - - // setup split.sub - area = "split.sub"; - rct.y = rct.y + rct.h; - this->area2size[area] = rct; - - // setup homescreen - area = "fullscreen"; - role = "homescreen"; - rct = compositor::full_rect; - if (rct.w <= 0) - rct.w = output_w + rct.w + 1; - if (rct.h <= 0) - rct.h = output_h + rct.h + 1; - this->area2size[area] = rct; - - // setup onscreen - area = "on_screen"; - role = "on_screen"; - auto ons_id = this->get_layer_id(role); - auto l_ons = this->get_layer(*ons_id); - rct = l_ons->rect; - if (rct.w < 0) - rct.w = output_w + 1 + rct.w; - if (rct.h < 0) - rct.h = output_h + 1 + rct.h; - this->area2size[area] = rct; + for (auto &i : this->area2size) + { + HMI_DEBUG("wm:lm", "area:%s size(after) : x:%d y:%d w:%d h:%d", + i.first.c_str(), i.second.x, i.second.y, i.second.w, i.second.h); + } } compositor::rect layer_map::getAreaSize(const std::string &area) @@ -246,4 +214,177 @@ compositor::rect layer_map::getAreaSize(const std::string &area) return area2size[area]; } +int layer_map::loadAreaDb() +{ + HMI_DEBUG("wm:lm", "Call"); + + // Get afm application installed dir + char const *afm_app_install_dir = getenv("AFM_APP_INSTALL_DIR"); + HMI_DEBUG("wm:lm", "afm_app_install_dir:%s", afm_app_install_dir); + + std::string file_name; + if (!afm_app_install_dir) + { + HMI_ERROR("wm:lm", "AFM_APP_INSTALL_DIR is not defined"); + } + else + { + file_name = std::string(afm_app_install_dir) + std::string("/etc/areas.db"); + } + + // Load area.db + json_object *json_obj; + int ret = jh::inputJsonFilie(file_name.c_str(), &json_obj); + if (0 > ret) + { + HMI_DEBUG("wm:lm", "Could not open area.db, so use default area information"); + json_obj = json_tokener_parse(kDefaultAreaDb); + } + HMI_DEBUG("wm:lm", "json_obj dump:%s", json_object_get_string(json_obj)); + + // Perse areas + HMI_DEBUG("wm:lm", "Perse areas"); + json_object *json_cfg; + if (!json_object_object_get_ex(json_obj, "areas", &json_cfg)) + { + HMI_ERROR("wm:lm", "Parse Error!!"); + return -1; + } + + int len = json_object_array_length(json_cfg); + HMI_DEBUG("wm:lm", "json_cfg len:%d", len); + HMI_DEBUG("wm:lm", "json_cfg dump:%s", json_object_get_string(json_cfg)); + + const char *area; + for (int i = 0; i < len; i++) + { + json_object *json_tmp = json_object_array_get_idx(json_cfg, i); + HMI_DEBUG("wm:lm", "> json_tmp dump:%s", json_object_get_string(json_tmp)); + + area = jh::getStringFromJson(json_tmp, "name"); + if (nullptr == area) + { + HMI_ERROR("wm:lm", "Parse Error!!"); + return -1; + } + HMI_DEBUG("wm:lm", "> area:%s", area); + + json_object *json_rect; + if (!json_object_object_get_ex(json_tmp, "rect", &json_rect)) + { + HMI_ERROR("wm:lm", "Parse Error!!"); + return -1; + } + HMI_DEBUG("wm:lm", "> json_rect dump:%s", json_object_get_string(json_rect)); + + compositor::rect area_size; + area_size.x = jh::getIntFromJson(json_rect, "x"); + area_size.y = jh::getIntFromJson(json_rect, "y"); + area_size.w = jh::getIntFromJson(json_rect, "w"); + area_size.h = jh::getIntFromJson(json_rect, "h"); + + this->area2size[area] = area_size; + } + + // Check + for (auto itr = this->area2size.begin(); + itr != this->area2size.end(); ++itr) + { + HMI_DEBUG("wm:lm", "area:%s x:%d y:%d w:%d h:%d", + itr->first.c_str(), itr->second.x, itr->second.y, + itr->second.w, itr->second.h); + } + + // Release json_object + json_object_put(json_obj); + + return 0; +} + +const char* layer_map::kDefaultAreaDb = "{ \ + \"areas\": [ \ + { \ + \"name\": \"fullscreen\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 0, \ + \"w\": -1, \ + \"h\": -1 \ + } \ + }, \ + { \ + \"name\": \"normal.full\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 218, \ + \"w\": -1, \ + \"h\": -433 \ + } \ + }, \ + { \ + \"name\": \"split.main\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 218, \ + \"w\": -1, \ + \"h\": 744 \ + } \ + }, \ + { \ + \"name\": \"split.sub\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 962, \ + \"w\": -1, \ + \"h\": 744 \ + } \ + }, \ + { \ + \"name\": \"software_keyboard\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 962, \ + \"w\": -1, \ + \"h\": 744 \ + } \ + }, \ + { \ + \"name\": \"restriction.normal\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 218, \ + \"w\": -1, \ + \"h\": -433 \ + } \ + }, \ + { \ + \"name\": \"restriction.split.main\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 218, \ + \"w\": -1, \ + \"h\": 744 \ + } \ + }, \ + { \ + \"name\": \"restriction.split.sub\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 962, \ + \"w\": -1, \ + \"h\": 744 \ + } \ + }, \ + { \ + \"name\": \"on_screen\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 218, \ + \"w\": -1, \ + \"h\": -433 \ + } \ + } \ + ] \ +}"; + } // namespace wm diff --git a/src/layers.hpp b/src/layers.hpp index a8ab2cc..b6dd67f 100644 --- a/src/layers.hpp +++ b/src/layers.hpp @@ -116,9 +116,12 @@ struct layer_map json to_json() const; void setupArea(int output_w, int output_h); compositor::rect getAreaSize(const std::string &area); + int loadAreaDb(); private: std::unordered_map area2size; + + static const char *kDefaultAreaDb; }; struct result to_layer_map(nlohmann::json const &j); diff --git a/src/window_manager.cpp b/src/window_manager.cpp index 481a5fb..de322df 100644 --- a/src/window_manager.cpp +++ b/src/window_manager.cpp @@ -687,6 +687,7 @@ int WindowManager::init_layers() this->layout_commit(); + this->layers.loadAreaDb(); this->layers.setupArea(o->width, o->height); return 0; @@ -721,17 +722,6 @@ void WindowManager::surface_set_layout(int surface_id, const std::string& area) int w = rect.w; int h = rect.h; - // less-than-0 values refer to MAX + 1 - $VALUE - // e.g. MAX is either screen width or height - if (w < 0) - { - w = this->controller->output_size.w + 1 + w; - } - if (h < 0) - { - h = this->controller->output_size.h + 1 + h; - } - HMI_DEBUG("wm", "surface_set_layout for surface %u on layer %u", surface_id, layer_id); -- 2.16.6