+WMError App::startTransition(unsigned req_num)
+{
+ bool sync_draw_happen = false;
+ bool found = false;
+ WMError ret = WMError::SUCCESS;
+ auto actions = g_app_list.getActions(req_num, &found);
+ if (!found)
+ {
+ ret = WMError::NO_ENTRY;
+ HMI_SEQ_ERROR(req_num,
+ "Window Manager bug :%s : Action is not set", errorDescription(ret));
+ return ret;
+ }
+
+ for (const auto &action : actions)
+ {
+ if (action.visible != TaskVisible::INVISIBLE)
+ {
+ sync_draw_happen = true;
+ this->emit_syncdraw(action.role, action.area);
+ /* TODO: emit event for app not subscriber
+ if(g_app_list.contains(y.appid))
+ g_app_list.lookUpClient(y.appid)->emit_syncdraw(y.role, y.area); */
+ }
+ }
+
+ if (sync_draw_happen)
+ {
+ this->setTimer();
+ }
+ else
+ {
+ // deactivate only, no syncDraw
+ // Make it deactivate here
+ for (const auto &x : actions)
+ {
+ if (g_app_list.contains(x.appid))
+ {
+ auto client = g_app_list.lookUpClient(x.appid);
+ this->deactivate(client->surfaceID(x.role));
+ }
+ }
+ ret = NO_LAYOUT_CHANGE;
+ }
+ return ret;
+}
+
+WMError App::setInvisibleTask(const std::string &role, bool split)
+{
+ unsigned req_num = g_app_list.currentRequestNumber();
+ HMI_SEQ_DEBUG(req_num, "set current visible app to invisible task");
+ // This task is copied from original actiavete surface
+ const char *drawing_name = role.c_str();
+ auto const &surface_id = this->lookup_id(drawing_name);
+ auto layer_id = this->layers.get_layer_id(*surface_id);
+ auto o_state = *this->layers.get_layout_state(*surface_id);
+ struct LayoutState &state = *o_state;
+ std::string add_name, add_role;
+ std::string add_area = "";
+ int surface;
+ TaskVisible task_visible = TaskVisible::INVISIBLE;
+ bool end_draw_finished = true;
+ bool found = false;
+
+ for (auto const &l : this->layers.mapping)
+ {
+ if (l.second.layer_id <= *layer_id)
+ {
+ continue;
+ }
+ HMI_DEBUG("wm", "debug: main %d , sub : %d", l.second.state.main, l.second.state.sub);
+ if (l.second.state.main != -1)
+ {
+ //this->deactivate(l.second.state.main);
+ surface = l.second.state.main;
+ add_role = *this->id_alloc.lookup(surface);
+ add_name = g_app_list.getAppID(surface, add_role, &found);
+ if(!found){
+ return WMError::NOT_REGISTERED;
+ }
+ HMI_SEQ_INFO(req_num, "Invisible %s", add_name.c_str());
+ WMAction act{add_name, add_role, add_area, task_visible, end_draw_finished};
+ g_app_list.setAction(req_num, act);
+ l.second.state.main = -1;
+ }
+
+ if (l.second.state.sub != -1)
+ {
+ //this->deactivate(l.second.state.sub);
+ surface = l.second.state.sub;
+ add_role = *this->id_alloc.lookup(surface);
+ add_name = g_app_list.getAppID(surface, add_role, &found);
+ if (!found)
+ {
+ return WMError::NOT_REGISTERED;
+ }
+ HMI_SEQ_INFO(req_num, "Invisible %s", add_name.c_str());
+ WMAction act{add_name, add_role, add_area, task_visible, end_draw_finished};
+ g_app_list.setAction(req_num, act);
+ l.second.state.sub = -1;
+ }
+ }
+
+ // change current state here, but this is hack
+ auto layer = this->layers.get_layer(*layer_id);
+
+ if (state.main == -1)
+ {
+ HMI_DEBUG("wm", "Layout: %s", kNameLayoutNormal);
+ //state = LayoutState{*surface_id};
+ /* this->try_layout(
+ state, LayoutState{*surface_id}, [&](LayoutState const &nl) {
+ HMI_DEBUG("wm", "Layout: %s", kNameLayoutNormal);
+ //this->surface_set_layout(*surface_id);
+ state = nl;
+
+ //compositor::rect area_rect = this->area_info[*surface_id];
+ }); */
+ }
+ else
+ {
+ if (0 != strcmp(drawing_name, "HomeScreen"))
+ {
+ if (split)
+ {
+ std::string main =
+ std::move(*this->id_alloc.lookup(state.main));
+ if (state.sub != *surface_id)
+ {
+ if (state.sub != -1)
+ {
+ //this->deactivate(state.sub);
+ WMAction deact_sub;
+ deact_sub.role = main;
+ deact_sub.area = add_area;
+ deact_sub.appid = g_app_list.getAppID(state.sub, main, &found);
+ if (!found)
+ {
+ HMI_SEQ_DEBUG(req_num, "sub surface doesn't exist");
+ return WMError::NOT_REGISTERED;
+ }
+ deact_sub.visible = task_visible;
+ deact_sub.end_draw_finished = end_draw_finished;
+ HMI_SEQ_DEBUG(req_num, "sub surface doesn't exist");
+ g_app_list.setAction(req_num, deact_sub);
+ }
+ }
+ //state = LayoutState{state.main, *surface_id};
+ }
+ else
+ {
+ HMI_DEBUG("wm", "Layout: %s", kNameLayoutNormal);
+
+ //this->surface_set_layout(*surface_id);
+ if (state.main != *surface_id)
+ {
+ // this->deactivate(state.main);
+ WMAction deact_main;
+ deact_main.role = std::move(*this->id_alloc.lookup(state.main));
+ ;
+ deact_main.area = add_area;
+ deact_main.appid = g_app_list.getAppID(state.main, deact_main.role, &found);
+ if (!found)
+ {
+ HMI_SEQ_DEBUG(req_num, "sub surface ddoesn't exist");
+ return WMError::NOT_REGISTERED;
+ }
+ deact_main.visible = task_visible;
+ deact_main.end_draw_finished = end_draw_finished;
+ HMI_SEQ_DEBUG(req_num, "sub surface doesn't exist");
+ g_app_list.setAction(req_num, deact_main);
+ }
+ if (state.sub != -1)
+ {
+ if (state.sub != *surface_id)
+ {
+ //this->deactivate(state.sub);
+ WMAction deact_sub;
+ deact_sub.role = std::move(*this->id_alloc.lookup(state.sub));
+ ;
+ deact_sub.area = add_area;
+ deact_sub.appid = g_app_list.getAppID(state.sub, deact_sub.role, &found);
+ if (!found)
+ {
+ HMI_SEQ_DEBUG(req_num, "sub surface ddoesn't exist");
+ return WMError::NOT_REGISTERED;
+ }
+ deact_sub.visible = task_visible;
+ deact_sub.end_draw_finished = end_draw_finished;
+ HMI_SEQ_DEBUG(req_num, "sub surface doesn't exist");
+ g_app_list.setAction(req_num, deact_sub);
+ }
+ }
+ //state = LayoutState{*surface_id};
+ }
+ }
+ }
+ return WMError::SUCCESS;
+}
+
+const char *App::check_surface_exist(const char *drawing_name)
+{
+ auto const &surface_id = this->lookup_id(drawing_name);
+ if (!surface_id)
+ {
+ //reply("Surface does not exist");
+ return "Surface does not exist";
+ }
+
+ if (!this->controller->surface_exists(*surface_id))
+ {
+ //reply("Surface does not exist in controller!");
+ return "Surface does not exist in controller!";
+ }
+
+ auto layer_id = this->layers.get_layer_id(*surface_id);
+
+ if (!layer_id)
+ {
+ //reply("Surface is not on any layer!");
+ return "Surface is not on any layer!";
+ }
+
+ auto o_state = *this->layers.get_layout_state(*surface_id);
+
+ if (o_state == nullptr)
+ {
+ //reply("Could not find layer for surface");
+ return "Could not find layer for surface";
+ }
+
+ HMI_DEBUG("wm", "surface %d is detected", *surface_id);
+ return nullptr;
+ //reply(nullptr);