-int App::allocateSurface() {
- HMI_DEBUG("wm", "Call");
-
- // Get current/previous layers
- LayoutManager::TypeLayers crr_layers = this->lm_.getCurrentLayers();
- LayoutManager::TypeLayers prv_layers = this->lm_.getPreviousLayers();
-
- // Update resource of all layers
- for (auto itr_layers = crr_layers.begin();
- itr_layers != crr_layers.end(); ++itr_layers) {
- // Get layer
- std::string layer = itr_layers->first;
- HMI_DEBUG("wm", "Try to update resource in %s layer", layer.c_str());
-
- // If layout is changed, update resouce
- if (this->lm_.isLayoutChanged(layer.c_str())) {
- // Get current/previous layout
- LayoutManager::TypeLayouts crr_layout = itr_layers->second;
- LayoutManager::TypeLayouts prv_layout = prv_layers[layer];
-
- // Get current/previous layout name
- std::string crr_layout_name = crr_layout.begin()->first;
- std::string prv_layout_name = prv_layout.begin()->first;
- HMI_DEBUG("wm", "layout name crr:%s prv:%s",
- crr_layout_name.c_str(), prv_layout_name.c_str());
-
- // Get current/previous ares
- LayoutManager::TypeAreas crr_areas = crr_layout[crr_layout_name];
- LayoutManager::TypeAreas prv_areas = prv_layout[prv_layout_name];
-
- // Create previous displayed role list
- std::string prv_area_name;
- std::vector<std::string> prv_role_list;
- for (auto itr_areas = prv_areas.begin();
- itr_areas != prv_areas.end(); ++itr_areas) {
- prv_area_name = itr_areas->first;
- prv_role_list.push_back(prv_areas[prv_area_name]["role"]);
- HMI_DEBUG("wm", "previous displayed role:%s",
- prv_areas[prv_area_name]["role"].c_str());
- }
-
- // Allocate surface for each area
- std::string crr_area_name;
- std::string crr_role_name;
- LayoutManager::TypeRolCtg crr_rol_ctg;
- for (auto itr_areas = crr_areas.begin();
- itr_areas != crr_areas.end(); ++itr_areas) {
- crr_area_name = itr_areas->first;
- crr_rol_ctg = itr_areas->second;
-
- // Get role of current area
- if ("category" == crr_rol_ctg.begin()->first) {
- // If current area have category
- // Get category name
- std::string crr_ctg = crr_rol_ctg.begin()->second;
-
- // Serch relevant role from previous displayed role list
- for (auto itr_role = prv_role_list.begin();
- itr_role != prv_role_list.end(); ++itr_role) {
- std::string prv_ctg = this->pm_.roleToCategory((*itr_role).c_str());
- if (crr_ctg == prv_ctg) {
- // First discovered role is set to current role
- crr_role_name = *itr_role;
-
- // Delete used role for other areas
- // which have same category
- prv_role_list.erase(itr_role);
-
- break;
- }
- }
- }
- else {
- crr_role_name = itr_areas->second["role"];
- }
- HMI_DEBUG("wm", "Allocate surface for area:%s role:%s",
- crr_area_name.c_str(), crr_role_name.c_str());
-
- // Deactivate non-displayed role
- std::string prv_role_name;
- if (crr_layout_name == prv_layout_name) {
- HMI_DEBUG("wm", "Current layout is same with previous");
-
- // Deactivate previous role in same area
- // if it is different with current
- prv_role_name = prv_areas[crr_area_name]["role"];
- if (crr_role_name != prv_role_name) {
- this->deactivate(prv_role_name);
- }
- }
- else {
- HMI_DEBUG("wm", "Current layout is different with previous");
-
- if ("none" != prv_layout_name) {
- // Deactivate previous role in all area in previous layout
- // if it is different with current role
- for(auto itr = prv_areas.begin(); itr != prv_areas.end(); ++itr) {
- prv_role_name = itr->second["role"].c_str();
- if (crr_role_name != prv_role_name) {
- this->deactivate(prv_role_name);
- }
- }
- }
- }
-
- // Set surface for displayed role
- if ("none" != crr_layout_name) {
- // If current layout is not "none",
- // set surface for current role
- this->setSurfaceSize(crr_role_name.c_str(), crr_area_name.c_str());
-
- // TODO:
- // This API is workaround.
- // Resource manager should manage each resource infomations
- // according to architecture document.
- this->lm_.updateArea(layer.c_str(), crr_role_name.c_str(), crr_area_name.c_str());
- }
- }
- }
- }
- return 0;
-}
-