diff options
author | Kazumasa Mitsunari <knimitz@witz-inc.co.jp> | 2018-06-13 21:25:32 +0900 |
---|---|---|
committer | Kazumasa Mitsunari <knimitz@witz-inc.co.jp> | 2018-06-13 21:27:40 +0900 |
commit | 77b239e85360594820534afe5cb79c7d60721f40 (patch) | |
tree | bbf24c5af94e94a8eed343dc6a608b89fa4c4959 /src | |
parent | bd8cb144f642f18bdf0168abebd2d0ab0bf638c4 (diff) |
activate/deactivate surface only set transtion state
Change-Id: If16e9ff1c584ee609aaac7db22400db92c1a6a93
Signed-off-by: Kazumasa Mitsunari <knimitz@witz-inc.co.jp>
Diffstat (limited to 'src')
-rw-r--r-- | src/app.cpp | 179 | ||||
-rw-r--r-- | src/app.hpp | 8 |
2 files changed, 115 insertions, 72 deletions
diff --git a/src/app.cpp b/src/app.cpp index d11ec8a..8832cda 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -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); @@ -568,105 +565,134 @@ 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 bool found; - bool is_activate = true; + WMError ret = WMError::LAYOUT_CHANGE_FAIL; auto trigger = g_app_list.getRequest(req_num, &found); - if(!found) + if (!found) { - WMError err = WMError::NO_ENTRY; - HMI_SEQ_ERROR(req_num, errorDescription(err)); - return err; + 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<struct WMAction>&) 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); - /* The following error check is not necessary because main.cpp will reject the message form not registered object - } */ + 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 + + /* 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, &found)) + for (const auto &y : actions) { - if (!found) - { - WMError err = WMError::NO_ENTRY; - HMI_SEQ_ERROR(req_num, "%s : Action is not set", errorDescription(err)); - return err; - } - /* - do_task(y); - */ - /* TODO - but current we can't do do_task, - so divide the processing into lm_layout_change and lm_release - */ 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; } @@ -916,8 +942,11 @@ void App::api_activate_surface(char const *appid, char const *drawing_name, char if (ret != WMError::SUCCESS) { - HMI_SEQ_ERROR(new_req, errorDescription(ret)); //this->emit_error() + HMI_SEQ_ERROR(new_req, errorDescription(ret)); + g_app_list.removeRequest(new_req); + g_app_list.next(); + g_app_list.reqDump(); } } @@ -973,6 +1002,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() } } @@ -1185,6 +1216,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); diff --git a/src/app.hpp b/src/app.hpp index a91654d..8b98788 100644 --- a/src/app.hpp +++ b/src/app.hpp @@ -257,12 +257,15 @@ struct App void emit_activated(char const *label); void emit_deactivated(char const *label); void emit_syncdraw(char const *label, char const *area, int x, int y, int w, int h); + void emit_syncdraw(const std::string &role, const std::string &area); void emit_flushdraw(char const *label); void emit_visible(char const *label, bool is_visible); void emit_invisible(char const *label); void emit_visible(char const *label); WMError do_transition(unsigned sequence_number); + WMError check_policy(unsigned req_num); + WMError start_transition(unsigned req_num); void do_enddraw(unsigned req_num); void process_request(); @@ -281,10 +284,11 @@ struct App // The following function is temporary. // Then will be removed when layermanager is finished - void lm_layout_change(const char *drawing_name); + void lm_layout_change(const char *drawing_name); WMError lm_layout_change(const struct WMAction &action); WMError lm_release(const struct WMAction &action); - void lm_enddraw(const char *drawing_name); + void lm_enddraw(const char *drawing_name); + void lm_get_area_info(const std::string &area); }; } // namespace wm |