X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fapp.cpp;h=d44986ed3f08a493be11276b9881b5b77fabbf38;hb=1be43a5f46ffe04d530e093077337c6582fd81d1;hp=5bd597c8caf67579129626ea4f67962f64ea2818;hpb=5d5a780a405fdb71a85898d8d988f6ee1bf3b3e0;p=apps%2Fagl-service-windowmanager.git diff --git a/src/app.cpp b/src/app.cpp index 5bd597c..d44986e 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -35,7 +35,7 @@ #include #include -#include "wm-client.hpp" +#include "wm_client.hpp" #include "applist.hpp" extern "C" @@ -554,9 +554,6 @@ WMError App::lm_layout_change(const struct WMAction &action) { const char *msg = this->check_surface_exist(action.role.c_str()); - /* - lm_.updateLayout(action); - TODO: emit syncDraw with application*/ if (msg) { HMI_SEQ_DEBUG(g_app_list.currentRequestNumber(), msg); @@ -567,93 +564,135 @@ WMError App::lm_layout_change(const struct WMAction &action) } WMError App::do_transition(unsigned req_num) +{ + HMI_SEQ_DEBUG(req_num, "check next state"); + WMError ret = this->check_policy(req_num); + if (ret != WMError::SUCCESS) + { + return ret; + } + HMI_SEQ_DEBUG(req_num, "Start transition."); + ret = this->start_transition(req_num); + return ret; +} + +WMError App::check_policy(unsigned req_num) { /* * Check Policy */ // get current trigger - auto trigger = g_app_list.getRequest(req_num); - bool is_activate = true; + bool found; + WMError ret = WMError::LAYOUT_CHANGE_FAIL; + auto trigger = g_app_list.getRequest(req_num, &found); + if (!found) + { + ret = WMError::NO_ENTRY; + return ret; + } + bool is_activate = (trigger.task == Task::TASK_ALLOCATE); + std::string req_area = trigger.area; - /* get new status from Policy Manager + // >>>> Compatible with current window manager until policy manager coming + if (is_activate) + { + const char *msg = this->check_surface_exist(trigger.role.c_str()); - (json_object*?) newLayout = checkPolicy(trigger); - (vector&) auto actions = translator.inputActionFromLayout(newLayout, currentLayout) - for(const auto& x : actions){ - g_app_list.setAciton(req_num, x) - } + if (msg) + { + HMI_SEQ_ERROR(g_app_list.currentRequestNumber(), msg); + ret = WMError::LAYOUT_CHANGE_FAIL; + return ret; + } - or + 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; - translator.inputActionFromLayout(newLayout, currentLayout, &g_app_list, req_num); + unsigned curernt_sid = state.main; + bool can_split = this->can_split(state, *surface_id); + + if (can_split) + { + // 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); + // 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 : %s", 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 + WMError ret = g_app_list.setAction(req_num, add_name, add_role, add_area); + if (ret != WMError::SUCCESS) + { + HMI_SEQ_ERROR(req_num, "Failed to set action"); + return ret; + } + g_app_list.reqDump(); + } + } + // >>>> This will be removed - /* The following error check is not necessary because main.cpp will reject the message form not registered object - } */ + /* get new status from Policy Manager */ HMI_SEQ_NOTICE(req_num, "ATM, Policy manager does't exist, then set WMAction as is"); - if (trigger.task == Task::TASK_RELEASE) - { - is_activate = false; - } - WMError ret = g_app_list.setAction(req_num, trigger.appid, trigger.role, trigger.area, is_activate); + ret = g_app_list.setAction(req_num, trigger.appid, trigger.role, req_area, is_activate); g_app_list.reqDump(); - if (ret != WMError::SUCCESS) + return ret; +} + +WMError App::start_transition(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) { - HMI_SEQ_ERROR(req_num, "Failed to set action"); + ret = WMError::NO_ENTRY; + HMI_SEQ_ERROR(req_num, "Window Manager bug :%s : Action is not set", errorDescription(ret)); return ret; } - // layer manager task - bool sync_draw_happen = false; - for (const auto &y : g_app_list.getActions(req_num)) - { - /* - do_task(y); - */ - /* TODO - but current we can't do do_task, - so divide the processing into lm_layout_change and lm_release - */ + for (const auto &y : actions) + { if (y.visible) { sync_draw_happen = true; - ret = lm_layout_change(y); - if (ret != WMError::SUCCESS) - { - HMI_SEQ_ERROR(req_num, "%s: appid: %s, role: %s, area: %s", - errorDescription(ret), y.appid.c_str(), y.role.c_str(), y.area.c_str()); - g_app_list.removeRequest(req_num); - break; - // TODO: if transition fails, what should we do? - } - /* g_app_list.lookUpClient(y.appid)->emit_syncdraw(y.role, y.area); */ - } - else - { - ret = lm_release(y); - if (!ret) - { - HMI_SEQ_ERROR(req_num, "Failed release resource: %s", y.appid.c_str()); - g_app_list.removeRequest(req_num); - break; - // TODO: if transition fails, what should we do? - } - /* g_app_list.lookUpClient(y.appid)->emit_invisible(y.role, y.area); */ + this->emit_syncdraw(y.role, y.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 (ret != WMError::SUCCESS) - { - //this->emit_error(req_num, 0 /*error_num*/, "error happens"); // test - } - else if (sync_draw_happen) + if (sync_draw_happen) { this->set_timer(); } else { - g_app_list.removeRequest(req_num); // HACK!!! + // deactivate only, no syncDraw + // Make it deactivate here + for (const auto &z : actions) + { + if (g_app_list.contains(z.appid)) + { + auto client = g_app_list.lookUpClient(z.appid); + this->deactivate(client->surfaceID(z.role)); + } + } + ret = NO_LAYOUT_CHANGE; } return ret; } @@ -850,61 +889,77 @@ const char *App::check_surface_exist(const char *drawing_name) //reply(nullptr); } -void App::api_activate_surface(char const *appid, char const *drawing_name, char const *drawing_area, const reply_func &reply) +WMError App::set_request(const std::string& appid, const std::string &role, const std::string &area, + Task task, unsigned* req_num) { - ST(); - - /* - * Check Phase - */ - - std::string id = appid; - std::string role = drawing_name; - std::string area = drawing_area; - - if (!g_app_list.contains(id)) + if (!g_app_list.contains(appid)) { - reply("app doesn't request 'requestSurface' yet"); - return; + return WMError::NOT_REGISTERED; } - auto client = g_app_list.lookUpClient(id); + auto client = g_app_list.lookUpClient(appid); /* * Queueing Phase */ unsigned current = g_app_list.currentRequestNumber(); - unsigned requested_num = g_app_list.getRequestNumber(id); + unsigned requested_num = g_app_list.getRequestNumber(appid); if (requested_num != 0) { - HMI_SEQ_INFO(requested_num, "%s %s %s request is already queued", id.c_str(), role.c_str(), area.c_str()); - reply("already requested"); - return; + 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(id, role, area, Task::TASK_ALLOCATE); + WMRequest req = WMRequest(appid, role, area, task); unsigned new_req = g_app_list.addAllocateRequest(req); + *req_num = new_req; g_app_list.reqDump(); - HMI_SEQ_DEBUG(current, "%s start sequence with %s, %s", id.c_str(), role.c_str(), area.c_str()); + HMI_SEQ_DEBUG(current, "%s start sequence with %s, %s", appid.c_str(), role.c_str(), area.c_str()); + + return WMError::SUCCESS; +} + +void App::api_activate_surface(char const *appid, char const *drawing_name, char const *drawing_area, const reply_func &reply) +{ + ST(); + + std::string id = appid; + std::string role = drawing_name; + std::string area = drawing_area; + Task task = Task::TASK_ALLOCATE; + unsigned req_num = 0; + WMError ret = WMError::UNKNOWN; + + ret = this->set_request(id, role, area, task, &req_num); + + if(ret != WMError::SUCCESS) + { + HMI_ERROR("wm", errorDescription(ret)); + reply("Failed to set request"); + return; + } reply(nullptr); - if (new_req != current) + if (req_num != g_app_list.currentRequestNumber()) { // Add request, then invoked after the previous task is finished - HMI_SEQ_DEBUG(new_req, "request is accepted"); + HMI_SEQ_DEBUG(req_num, "request is accepted"); return; } /* * Do allocate tasks */ - WMError ret = this->do_transition(new_req); + ret = this->do_transition(req_num); if (ret != WMError::SUCCESS) { - HMI_SEQ_ERROR(new_req, errorDescription(ret)); //this->emit_error() + HMI_SEQ_ERROR(req_num, errorDescription(ret)); + g_app_list.removeRequest(req_num); + g_app_list.next(); + g_app_list.reqDump(); } } @@ -960,6 +1015,8 @@ void App::api_deactivate_surface(char const *appid, char const *drawing_name, co if (ret != WMError::SUCCESS) { HMI_SEQ_ERROR(new_req, errorDescription(ret)); + g_app_list.removeRequest(new_req); + g_app_list.next(); //this->emit_error() } } @@ -1006,7 +1063,15 @@ void App::lm_enddraw(const char *drawing_name) void App::do_enddraw(unsigned req_num) { // get actions - auto actions = g_app_list.getActions(req_num); + bool found; + auto actions = g_app_list.getActions(req_num, &found); + if (!found) + { + WMError err = WMError::NO_ENTRY; + HMI_SEQ_ERROR(req_num, errorDescription(err)); + return; + } + HMI_SEQ_INFO(req_num, "do endDraw"); for (const auto &act : actions) @@ -1164,6 +1229,14 @@ void App::emit_syncdraw(char const *label, char const *area, int x, int y, int w this->send_event(kListEventName[Event_SyncDraw], label, area, x, y, w, h); } +void App::emit_syncdraw(const std::string &role, const std::string &area) +{ + int x = 0, y = 0, w = 0, h = 0; + //this->lm_get_area_info(area, &x, &y, &w, &h); + this->send_event(kListEventName[Event_SyncDraw], + role.c_str(), area.c_str(), x, y, w, h); +} + void App::emit_flushdraw(char const *label) { this->send_event(kListEventName[Event_FlushDraw], label);