+/**
+ * This function is substitute of requestSurface
+ * If surface creation is faster than application request of this function,
+ * WM will bind surfaceID with application and role.
+ * If surface creation is slower than application request of thie function,
+ * WM will put Client into pending list.
+ *
+ * Note :
+ * Application can request with pid but this is temporary solution for now.
+ * This will be removed.
+ * */
+bool WindowManager::api_set_role(char const *appid, char const *drawing_name, unsigned pid){
+ string id = appid;
+ string role = drawing_name;
+ string l_name;
+ unsigned surface = 0;
+ WMError wm_err = WMError::UNKNOWN;
+ bool ret = false;
+
+ // get layer ID which role should be in
+ // auto lid = this->layers.get_layer_id(role);
+ unsigned lid = this->lc->getNewLayerID(role, &l_name);
+ if (lid == 0)
+ {
+ // lid = this->layers.get_layer_id(string("fallback"));
+ HMI_DEBUG("%s is not registered in layers.json, then fallback as normal app", role.c_str());
+ if (lid == 0)
+ {
+ HMI_ERROR("Drawing name does not match any role, fallback is disabled");
+ return ret;
+ }
+ }
+
+ if(0 != pid){
+ // search floating surfaceID from pid if pid is designated.
+ wm_err = g_app_list.popFloatingSurface(pid, &surface);
+ }
+ else{
+ // get floating surface with appid. If WM queries appid from pid,
+ // WM can bind surface and role with appid(not implemented yet)
+ //wm_err = g_app_list.popFloatingSurface(id);
+ }
+ if(wm_err != WMError::SUCCESS){
+ HMI_ERROR("No floating surface for app: %s", id.c_str());
+ g_app_list.addFloatingClient(id, lid, role);
+ HMI_NOTICE("%s : Waiting for surface creation", id.c_str());
+ return ret;
+ }
+
+ ret = true;
+ if (g_app_list.contains(id))
+ {
+ HMI_INFO("Add role: %s with surface: %d. Client %s has multi surfaces.",
+ role.c_str(), surface, id.c_str());
+ auto client = g_app_list.lookUpClient(id);
+ client->appendRole(role);
+ }
+ else{
+ HMI_INFO("Create new client: %s, surface: %d into layer: %d with role: %s",
+ id.c_str(), surface, lid, role.c_str());
+ g_app_list.addClient(id, lid, role);
+ }
+
+ // register pair drawing_name and ivi_id
+ this->id_alloc.register_name_id(role.c_str(), surface);
+ // this->layers.add_surface(surface, *lid);
+
+ // this surface is already created
+ HMI_DEBUG("surface_id is %u, layer_id is %u", surface, lid);
+
+ // const auto &o_layer = this->layers.get_layer(*lid);
+ /* auto rect = o_layer.value().rect;
+ if(rect.w < 0)
+ {
+ rect.w = this->controller->output_size.w + 1 + rect.w;
+ }
+ if(rect.h < 0)
+ {
+ rect.h = this->controller->output_size.h + 1 + rect.h;
+ } */
+
+ // this->controller->layers[*lid]->add_surface(surface);
+ // this->layout_commit();
+
+ return ret;
+}
+