-void WindowManager::emit_syncdraw(char const *label, char const *area, int x, int y, int w, int h)
-{
- this->send_event(kListEventName[Event_SyncDraw], label, area, x, y, w, h);
-}
-
-void WindowManager::emit_syncdraw(const std::string &role, const std::string &area)
-{
- compositor::rect rect = this->layers.getAreaSize(area);
- this->send_event(kListEventName[Event_SyncDraw],
- role.c_str(), area.c_str(), rect.x, rect.y, rect.w, rect.h);
-}
-
-void WindowManager::emit_flushdraw(char const *label)
-{
- this->send_event(kListEventName[Event_FlushDraw], label);
-}
-
-void WindowManager::emit_visible(char const *label, bool is_visible)
-{
- this->send_event(is_visible ? kListEventName[Event_Visible] : kListEventName[Event_Invisible], label);
-}
-
-void WindowManager::emit_invisible(char const *label)
-{
- return emit_visible(label, false);
-}
-
-void WindowManager::emit_visible(char const *label) { return emit_visible(label, true); }
-
-void WindowManager::activate(int id)
-{
- auto ip = this->controller->sprops.find(id);
- if (ip != this->controller->sprops.end())
- {
- this->controller->surfaces[id]->set_visibility(1);
- char const *label =
- this->lookup_name(id).value_or("unknown-name").c_str();
-
- // FOR CES DEMO >>>
- if ((0 == strcmp(label, "radio")) ||
- (0 == strcmp(label, "music")) ||
- (0 == strcmp(label, "video")) ||
- (0 == strcmp(label, "map")))
- {
- for (auto i = surface_bg.begin(); i != surface_bg.end(); ++i)
- {
- if (id == *i)
- {
- // Remove id
- this->surface_bg.erase(i);
-
- // Remove from BG layer (999)
- HMI_DEBUG("wm", "Remove %s(%d) from BG layer", label, id);
- this->controller->layers[999]->remove_surface(id);
-
- // Add to FG layer (1001)
- HMI_DEBUG("wm", "Add %s(%d) to FG layer", label, id);
- this->controller->layers[1001]->add_surface(id);
-
- for (int j : this->surface_bg)
- {
- HMI_DEBUG("wm", "Stored id:%d", j);
- }
- break;
- }
- }
- }
- // <<< FOR CES DEMO
-
- this->layout_commit();
-
- // TODO: application requests by old role,
- // so convert role new to old for emitting event
- const char* old_role = this->rolenew2old[label].c_str();
-
- this->emit_visible(old_role);
- this->emit_activated(old_role);
- }
-}
-
-void WindowManager::deactivate(int id)
-{
- auto ip = this->controller->sprops.find(id);
- if (ip != this->controller->sprops.end())
- {
- char const *label =
- this->lookup_name(id).value_or("unknown-name").c_str();
-
- // FOR CES DEMO >>>
- if ((0 == strcmp(label, "radio")) ||
- (0 == strcmp(label, "music")) ||
- (0 == strcmp(label, "video")) ||
- (0 == strcmp(label, "map")))
- {
-
- // Store id
- this->surface_bg.push_back(id);
-
- // Remove from FG layer (1001)
- HMI_DEBUG("wm", "Remove %s(%d) from FG layer", label, id);
- this->controller->layers[1001]->remove_surface(id);
-
- // Add to BG layer (999)
- HMI_DEBUG("wm", "Add %s(%d) to BG layer", label, id);
- this->controller->layers[999]->add_surface(id);
-
- for (int j : surface_bg)
- {
- HMI_DEBUG("wm", "Stored id:%d", j);
- }
- }
- else
- {
- this->controller->surfaces[id]->set_visibility(0);
- }
- // <<< FOR CES DEMO
-
- this->layout_commit();
-
- // TODO: application requests by old role,
- // so convert role new to old for emitting event
- const char* old_role = this->rolenew2old[label].c_str();
-
- this->emit_deactivated(old_role);
- this->emit_invisible(old_role);
- }
-}
-
-WMError WindowManager::setRequest(const std::string& appid, const std::string &role, const std::string &area,
- Task task, unsigned* req_num)
-{
- if (!g_app_list.contains(appid))
- {
- return WMError::NOT_REGISTERED;
- }
-
- auto client = g_app_list.lookUpClient(appid);
-
- /*
- * Queueing Phase
- */
- unsigned current = g_app_list.currentRequestNumber();
- unsigned requested_num = g_app_list.getRequestNumber(appid);
- if (requested_num != 0)
- {
- HMI_SEQ_INFO(requested_num,
- "%s %s %s request is already queued", appid.c_str(), role.c_str(), area.c_str());
- return REQ_REJECTED;
- }
-
- WMRequest req = WMRequest(appid, role, area, task);
- unsigned new_req = g_app_list.addRequest(req);
- *req_num = new_req;
- g_app_list.reqDump();
-
- HMI_SEQ_DEBUG(current, "%s start sequence with %s, %s", appid.c_str(), role.c_str(), area.c_str());
-
- return WMError::SUCCESS;
-}
-
-WMError WindowManager::doTransition(unsigned req_num)
-{
- HMI_SEQ_DEBUG(req_num, "check policy");
- WMError ret = this->checkPolicy(req_num);
- if (ret != WMError::SUCCESS)
- {
- return ret;
- }
- HMI_SEQ_DEBUG(req_num, "Start transition.");
- ret = this->startTransition(req_num);
- return ret;
-}
-
-WMError WindowManager::checkPolicy(unsigned req_num)
-{
- /*
- * Check Policy
- */
- // get current trigger
- bool found = false;
- bool split = false;
- WMError ret = WMError::LAYOUT_CHANGE_FAIL;
- auto trigger = g_app_list.getRequest(req_num, &found);
- if (!found)
- {
- ret = WMError::NO_ENTRY;
- return ret;
- }
- std::string req_area = trigger.area;
-
- // >>>> Compatible with current window manager until policy manager coming
- if (trigger.task == Task::TASK_ALLOCATE)
- {
- HMI_SEQ_DEBUG(req_num, "Check split or not");
- const char *msg = this->check_surface_exist(trigger.role.c_str());
-
- if (msg)
- {
- HMI_SEQ_ERROR(req_num, msg);
- ret = WMError::LAYOUT_CHANGE_FAIL;
- return ret;
- }
-
- auto const &surface_id = this->lookup_id(trigger.role.c_str());
- auto o_state = *this->layers.get_layout_state(*surface_id);
- struct LayoutState &state = *o_state;
-
- unsigned curernt_sid = state.main;
- split = this->can_split(state, *surface_id);
-
- if (split)
- {
- HMI_SEQ_DEBUG(req_num, "Split happens");
- // Get current visible role
- std::string add_role = this->lookup_name(state.main).value();
- // Set next area
- std::string add_area = std::string(kNameLayoutSplit) + "." + std::string(kNameAreaMain);
- // Change request area
- req_area = std::string(kNameLayoutSplit) + "." + std::string(kNameAreaSub);
- HMI_SEQ_NOTICE(req_num, "Change request area from %s to %s, because split happens",
- trigger.area.c_str(), req_area.c_str());
- // set another action
- std::string add_name = g_app_list.getAppID(curernt_sid, add_role, &found);
- if (!found)
- {
- HMI_SEQ_ERROR(req_num, "Couldn't widhdraw with surfaceID : %d", curernt_sid);
- ret = WMError::NOT_REGISTERED;
- return ret;
- }
- HMI_SEQ_INFO(req_num, "Additional split app %s, role: %s, area: %s",
- add_name.c_str(), add_role.c_str(), add_area.c_str());
- // Set split action
- bool end_draw_finished = false;
- WMAction split_action{
- add_name,
- add_role,
- add_area,
- TaskVisible::VISIBLE,
- end_draw_finished};
- WMError ret = g_app_list.setAction(req_num, split_action);
- if (ret != WMError::SUCCESS)
- {
- HMI_SEQ_ERROR(req_num, "Failed to set action");
- return ret;
- }
- g_app_list.reqDump();
- }
- }
- else
- {
- HMI_SEQ_DEBUG(req_num, "split doesn't happen");
- }
-
- // Set invisible task(Remove if policy manager finish)
- ret = this->setInvisibleTask(trigger.role, split);
- if(ret != WMError::SUCCESS)
- {
- HMI_SEQ_ERROR(req_num, "Failed to set invisible task: %s", errorDescription(ret));
- return ret;
- }
-
- /* get new status from Policy Manager */
- HMI_SEQ_NOTICE(req_num, "ATM, Policy manager does't exist, then set WMAction as is");
- if(trigger.role == "homescreen")
- {
- // TODO : Remove when Policy Manager completed
- HMI_SEQ_NOTICE(req_num, "Hack. This process will be removed. Change HomeScreen code!!");
- req_area = "fullscreen";
- }
- TaskVisible task_visible =
- (trigger.task == Task::TASK_ALLOCATE) ? TaskVisible::VISIBLE : TaskVisible::INVISIBLE;
-
- ret = g_app_list.setAction(req_num, trigger.appid, trigger.role, req_area, task_visible);
- g_app_list.reqDump();
-
- return ret;
-}
-
-WMError WindowManager::startTransition(unsigned req_num)