X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwm_client.cpp;h=f2ad7be467a0d59708683c959ce3925ea438eaa9;hb=b9da444f98dd5075dcda05932c47c732a5ae230f;hp=724554941bae36d46d47dff5be28a0ee5911e916;hpb=e5295c77d4c436212265edeca7f9a4818a5133e6;p=apps%2Fagl-service-windowmanager.git diff --git a/src/wm_client.cpp b/src/wm_client.cpp index 7245549..f2ad7be 100644 --- a/src/wm_client.cpp +++ b/src/wm_client.cpp @@ -17,6 +17,9 @@ #include #include "wm_client.hpp" #include "util.hpp" +#include +#include + #define INVALID_SURFACE_ID 0 @@ -71,12 +74,14 @@ WMClient::WMClient(const string &appid, const string &role) } } -WMClient::WMClient(const string &appid, unsigned layer, - const string& layer_name, unsigned surface, const string &role) - : id(appid), layer(layer), wm_layer_name(layer_name), - role2surface(0) +WMClient::WMClient(const string &appid, unsigned layer, const string &role) + : id(appid), + layer(layer), + main_role(role), + role2surface(0), + evname2afb_event(0) { - role2surface[role] = surface; + role2surface[role] = INVALID_SURFACE_ID; for (auto x : kWMEvents) { #if GTEST_ENABLED @@ -93,25 +98,9 @@ string WMClient::appID() const return this->id; } -unsigned WMClient::surfaceID(const string &role) const +string WMClient::role() const { - if (0 == this->role2surface.count(role)) - { - return INVALID_SURFACE_ID; - } - return this->role2surface.at(role); -} - -std::string WMClient::role(unsigned surface) const -{ - for(const auto& x : this->role2surface) - { - if(x.second == surface) - { - return x.first; - } - } - return std::string(""); + return this->main_role; } unsigned WMClient::layerID() const @@ -124,70 +113,115 @@ unsigned WMClient::surfaceID() const return this->surface; } -const string& WMClient::getWMLayerName() -{ - return this->wm_layer_name; -} - -void WMClient::setRole(const string& role) -{ - this->role_list.clear(); - this->role_list.push_back(role); -} - -void WMClient::appendRole(const string& role) -{ - this->role_list.push_back(role); -} - /** - * Add the pair of role and surface to the client + * Add surface to the client * - * This function set the pair of role and surface to the client. - * This function is used for the client which has multi surfaces. - * If the model and relationship for role and surface(layer) - * is changed, this function will be changed - * Current Window Manager doesn't use this function. + * This function add main surface to the client(ivi_layer). * * @param string[in] role - * @param unsigned[in] surface - * @return true + * @return WMError */ -bool WMClient::addSurface(const string &role, unsigned surface) +WMError WMClient::addSurface(unsigned surface) { - HMI_DEBUG("Add role %s with surface %d", role.c_str(), surface); - if (0 != this->role2surface.count(role)) + this->surface = surface; + ilmErrorTypes err = ilm_layerAddSurface(this->layer, surface); + + if(err == ILM_SUCCESS) { - HMI_NOTICE("override surfaceID %d with %d", this->role2surface[role], surface); + err = ilm_commitChanges(); } - this->role2surface[role] = surface; - return true; + return (err == ILM_SUCCESS) ? WMError::SUCCESS : WMError::FAIL; } bool WMClient::removeSurfaceIfExist(unsigned surface) { bool ret = false; - for (auto &x : this->role2surface) + if(surface == this->surface) { - if (surface == x.second) + this->surface = INVALID_SURFACE_ID; + ret = true; + } + else + { + for(auto &x : this->service2surfaces) + { + if(x.second = surface) + { + ret = true; + string key = x.first; + this->service2surfaces.erase(key); + this->service2supplier.erase(key); + } + } + } + return ret; +} + +WMError WMClient::setRenderOrder(const vector &order) +{ + WMError ret = WMError::SUCCESS; + this->surface_render_order.clear(); + for(const auto& x : order) + { + unsigned s; // surface + if(x == this->role()) + { + s = this->surfaceID(); + } + else if(this->service2surfaces.count(x) != 0) + { + s = this->service2surfaces[x]; + } + else { - HMI_INFO("Remove surface from client %s: role %s, surface: %d", - this->id.c_str(), x.first.c_str(), x.second); - this->role2surface.erase(x.first); - ret = true; + ret = WMError::NOT_REGISTERED; break; } + this->surface_render_order.push_back(s); + } + if(ret == WMError::SUCCESS) + { + int count = 0; + t_ilm_layer* id_array = new t_ilm_surface[this->surface_render_order.size()]; + if(id_array == nullptr) + { + HMI_WARNING("short memory"); + ret = WMError::FAIL; + } + else + { + for(const auto& i : this->surface_render_order) + { + id_array[count] = i; + ++count; + } + ilm_layerSetRenderOrder(this->layerID(), + id_array, this->surface_render_order.size()); + delete id_array; + } } return ret; } -bool WMClient::removeRole(const string &role) +string WMClient::attachTmpServiceSurface(const string& supplier, const string& service_surface) { - bool ret = false; - if (this->role2surface.count(role) != 0) + string uuid; + uuid_t u; + char out[37]; // uuid is 36 characters + uuid_generate_random(u); + uuid_unparse(u, out); + uuid = out; + this->service2supplier.emplace(service_surface, supplier); + return uuid; +} + +WMError WMClient::attachServiceSurface(const string& service_surface, unsigned surface) +{ + WMError ret = WMError::NOT_REGISTERED; + if(this->service2supplier.count(service_surface) != 0) { - this->role2surface.erase(role); - ret = true; + this->service2surfaces.emplace(service_surface, surface); + ret = WMError::SUCCESS; } return ret; } @@ -231,10 +265,7 @@ void WMClient::dumpInfo() { DUMP("APPID : %s", id.c_str()); DUMP(" LAYER : %d", layer); - for (const auto &x : this->role2surface) - { - DUMP(" ROLE : %s , SURFACE : %d", x.first.c_str(), x.second); - } + DUMP(" ROLE : %s , SURFACE : %d", main_role.c_str(), surface); } } // namespace wm \ No newline at end of file