X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwm_client.cpp;h=356cd6f49f346190d21d64f8e2f2745488140265;hb=d2c062959c55c61a4e350f6df480d46d2a8d769c;hp=4aecbf4db854d8e332ffd3b8d5ad9fe1db128652;hpb=c3291c967516a188789a860821471d8c872fbb47;p=apps%2Fagl-service-windowmanager.git diff --git a/src/wm_client.cpp b/src/wm_client.cpp index 4aecbf4..356cd6f 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,30 +74,33 @@ WMClient::WMClient(const string &appid, const string &role) } } -string WMClient::appID() const +WMClient::WMClient(const string &appid, unsigned layer, const string &role) + : id(appid), + layer(layer), + main_role(role), + role2surface(0), + evname2afb_event(0) { - return this->id; + role2surface[role] = INVALID_SURFACE_ID; + for (auto x : kWMEvents) + { +#if GTEST_ENABLED + string ev = x; +#else + afb_event ev = afb_daemon_make_event(x.c_str()); +#endif + evname2afb_event[x] = ev; + } } -unsigned WMClient::surfaceID(const string &role) const +string WMClient::appID() const { - if (0 == this->role2surface.count(role)) - { - return INVALID_SURFACE_ID; - } - return this->role2surface.at(role); + return this->id; } -std::string WMClient::role(unsigned surface) const +string WMClient::role() 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 @@ -107,80 +113,102 @@ 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.push_back(role); -} - /** - * Set layerID the client belongs to + * Add surface to the client * - * This function set layerID the client belongs to. - * But this function may not used because the layer should be fixed at constructor. - * So this function will be used to change layer by some reasons. - * - * @param unsigned[in] layerID - * @return None - * @attention WMClient can't have multiple layer - */ -void WMClient::registerLayer(unsigned layer) -{ - this->layer = layer; -} - -/** - * Add the pair of role and 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) + { + this->surface = INVALID_SURFACE_ID; + ret = true; + } + return ret; +} + +WMError WMClient::setRenderOrder(const vector &order) +{ + WMError ret = WMError::SUCCESS; + this->surface_render_order.clear(); + for(const auto& x : order) { - if (surface == x.second) + unsigned s; // surface + if(x == this->role()) + { + s = this->surfaceID(); + } + else if(this->service2surfaces.count(x) != 0) { - 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; + s = this->service2surfaces[x]; + } + else + { + 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; } @@ -224,10 +252,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