X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fapp.cpp;h=0c8980469168337e83152729c56e2b2ca688edde;hb=f9af8481e7221cd61a719c877dfe14b842f66eb7;hp=414e1fb1ab34f7f0685f06c378cc05d5c8d261f1;hpb=aae4a578e9c23a7418053fdc15599f0c19fc7f17;p=apps%2Fagl-service-windowmanager.git diff --git a/src/app.cpp b/src/app.cpp index 414e1fb..0c89804 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -314,6 +314,8 @@ int App::init_layers() this->layout_commit(); + this->layers.setupArea(o->width, o->height); + return 0; } @@ -355,45 +357,6 @@ void App::surface_set_layout(int surface_id, optional sub_surface_id) h = this->controller->output_size.h + 1 + h; } - /* if (sub_surface_id) - { - if (o_layer_id != this->layers.get_layer_id(*sub_surface_id)) - { - HMI_ERROR("wm", - "surface_set_layout: layers of surfaces (%d and %d) don't match!", - surface_id, *sub_surface_id); - return; - } - - int x_off = 0; - int y_off = 0; - - // split along major axis - if (w > h) - { - w /= 2; - x_off = w; - } - else - { - h /= 2; - y_off = h; - } - - auto &ss = this->controller->surfaces[*sub_surface_id]; - - HMI_DEBUG("wm", "surface_set_layout for sub surface %u on layer %u", - *sub_surface_id, layer_id); - - // set destination to the display rectangle - ss->set_destination_rectangle(x + x_off, y + y_off, w, h); - - this->area_info[*sub_surface_id].x = x; - this->area_info[*sub_surface_id].y = y; - this->area_info[*sub_surface_id].w = w; - this->area_info[*sub_surface_id].h = h; - } */ - HMI_DEBUG("wm", "surface_set_layout for surface %u on layer %u", surface_id, layer_id); @@ -545,19 +508,6 @@ WMError App::lm_release(const struct WMAction &action) return WMError::SUCCESS; } -/* WMError App::lm_layout_change(const struct WMAction &action) -{ - const char *msg = this->check_surface_exist(action.role.c_str()); - - if (msg) - { - HMI_SEQ_DEBUG(g_app_list.currentRequestNumber(), msg); - return WMError::LAYOUT_CHANGE_FAIL; - } - this->lm_layout_change(action.role.c_str()); - return WMError::SUCCESS; -} */ - WMError App::doTransition(unsigned req_num) { HMI_SEQ_DEBUG(req_num, "check policy"); @@ -617,6 +567,7 @@ WMError App::checkPolicy(unsigned req_num) 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 is happen", trigger.area, req_area); // set another action std::string add_name = g_app_list.getAppID(curernt_sid, add_role, &found); if (!found) @@ -628,13 +579,12 @@ WMError App::checkPolicy(unsigned req_num) 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 visible = true; bool end_draw_finished = false; WMAction split_action{ add_name, add_role, add_area, - visible, + TaskVisible::VISIBLE, end_draw_finished}; WMError ret = g_app_list.setAction(req_num, split_action); if (ret != WMError::SUCCESS) @@ -660,8 +610,9 @@ WMError App::checkPolicy(unsigned req_num) /* get new status from Policy Manager */ HMI_SEQ_NOTICE(req_num, "ATM, Policy manager does't exist, then set WMAction as is"); + 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, trigger.task); + ret = g_app_list.setAction(req_num, trigger.appid, trigger.role, req_area, task_visible); g_app_list.reqDump(); return ret; @@ -682,7 +633,7 @@ WMError App::startTransition(unsigned req_num) for (const auto &y : actions) { - if (y.visible) + if (y.visible != TaskVisible::INVISIBLE) { sync_draw_happen = true; this->emit_syncdraw(y.role, y.area); @@ -726,7 +677,7 @@ WMError App::setInvisibleTask(const std::string &role, bool split) std::string add_name, add_role; std::string add_area = ""; int surface; - bool visible = false; + TaskVisible task_visible = TaskVisible::INVISIBLE; bool end_draw_finished = true; bool found = false; @@ -746,7 +697,7 @@ WMError App::setInvisibleTask(const std::string &role, bool split) return WMError::NOT_REGISTERED; } HMI_SEQ_INFO(req, "Invisible %s", add_name.c_str()); - WMAction act{add_name, add_role, add_area, visible, end_draw_finished}; + WMAction act{add_name, add_role, add_area, task_visible, end_draw_finished}; g_app_list.setAction(req, act); l.second.state.main = -1; } @@ -762,7 +713,7 @@ WMError App::setInvisibleTask(const std::string &role, bool split) return WMError::NOT_REGISTERED; } HMI_SEQ_INFO(req, "Invisible %s", add_name.c_str()); - WMAction act{add_name, add_role, add_area, visible, end_draw_finished}; + WMAction act{add_name, add_role, add_area, task_visible, end_draw_finished}; g_app_list.setAction(req, act); l.second.state.sub = -1; } @@ -774,7 +725,7 @@ WMError App::setInvisibleTask(const std::string &role, bool split) if (state.main == -1) { HMI_DEBUG("wm", "Layout: %s", kNameLayoutNormal); - state = LayoutState{*surface_id}; + //state = LayoutState{*surface_id}; /* this->try_layout( state, LayoutState{*surface_id}, [&](LayoutState const &nl) { HMI_DEBUG("wm", "Layout: %s", kNameLayoutNormal); @@ -806,13 +757,13 @@ WMError App::setInvisibleTask(const std::string &role, bool split) HMI_SEQ_DEBUG(req, "sub surface ddoesn't exist"); return WMError::NOT_REGISTERED; } - deact_sub.visible = visible; + deact_sub.visible = task_visible; deact_sub.end_draw_finished = end_draw_finished; HMI_SEQ_DEBUG(req, "sub surface ddoesn't exist"); g_app_list.setAction(req, deact_sub); } } - state = LayoutState{state.main, *surface_id}; + //state = LayoutState{state.main, *surface_id}; } else { @@ -832,7 +783,7 @@ WMError App::setInvisibleTask(const std::string &role, bool split) HMI_SEQ_DEBUG(req, "sub surface ddoesn't exist"); return WMError::NOT_REGISTERED; } - deact_main.visible = visible; + deact_main.visible = task_visible; deact_main.end_draw_finished = end_draw_finished; HMI_SEQ_DEBUG(req, "sub surface doesn't exist"); g_app_list.setAction(req, deact_main); @@ -852,176 +803,19 @@ WMError App::setInvisibleTask(const std::string &role, bool split) HMI_SEQ_DEBUG(req, "sub surface ddoesn't exist"); return WMError::NOT_REGISTERED; } - deact_sub.visible = visible; + deact_sub.visible = task_visible; deact_sub.end_draw_finished = end_draw_finished; - HMI_SEQ_DEBUG(req, "sub surface ddoesn't exist"); + HMI_SEQ_DEBUG(req, "sub surface doesn't exist"); g_app_list.setAction(req, deact_sub); } } - state = LayoutState{*surface_id}; + //state = LayoutState{*surface_id}; } } } - return WMError::SUCCESS; } -/* void App::lm_layout_change(const char *drawing_name) -{ - 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; - - // disable layers that are above our current layer - for (auto const &l : this->layers.mapping) - { - if (l.second.layer_id <= *layer_id) - { - continue; - } - - bool flush = false; - if (l.second.state.main != -1) - { - this->deactivate(l.second.state.main); - l.second.state.main = -1; - flush = true; - } - - if (l.second.state.sub != -1) - { - this->deactivate(l.second.state.sub); - l.second.state.sub = -1; - flush = true; - } - - if (flush) - { - this->layout_commit(); - } - } - - auto layer = this->layers.get_layer(*layer_id); - - if (state.main == -1) - { - this->try_layout( - state, LayoutState{*surface_id}, [&](LayoutState const &nl) { - HMI_DEBUG("wm", "Layout: %s", kNameLayoutNormal); - this->surface_set_layout(*surface_id); - state = nl; - - // Commit for configuraton - this->layout_commit(); - - std::string str_area = std::string(kNameLayoutNormal) + "." + std::string(kNameAreaFull); - compositor::rect area_rect = this->area_info[*surface_id]; - this->emit_syncdraw(drawing_name, str_area.c_str(), - area_rect.x, area_rect.y, area_rect.w, area_rect.h); - this->enqueue_flushdraw(state.main); - }); - } - else - { - if (0 == strcmp(drawing_name, "HomeScreen")) - { - this->try_layout( - state, LayoutState{*surface_id}, [&](LayoutState const &nl) { - HMI_DEBUG("wm", "Layout: %s", kNameLayoutNormal); - std::string str_area = std::string(kNameLayoutNormal) + "." + std::string(kNameAreaFull); - compositor::rect area_rect = this->area_info[*surface_id]; - this->emit_syncdraw(drawing_name, str_area.c_str(), - area_rect.x, area_rect.y, area_rect.w, area_rect.h); - this->enqueue_flushdraw(state.main); - }); - } - else - { - bool can_split = this->can_split(state, *surface_id); - - if (can_split) - { - this->try_layout( - state, - LayoutState{state.main, *surface_id}, - [&](LayoutState const &nl) { - HMI_DEBUG("wm", "Layout: %s", kNameLayoutSplit); - std::string main = - std::move(*this->lookup_name(state.main)); - - this->surface_set_layout(state.main, surface_id); - if (state.sub != *surface_id) - { - if (state.sub != -1) - { - this->deactivate(state.sub); - } - } - state = nl; - - // Commit for configuration and visibility(0) - this->layout_commit(); - - std::string str_area_main = std::string(kNameLayoutSplit) + "." + std::string(kNameAreaMain); - std::string str_area_sub = std::string(kNameLayoutSplit) + "." + std::string(kNameAreaSub); - compositor::rect area_rect_main = this->area_info[state.main]; - compositor::rect area_rect_sub = this->area_info[*surface_id]; - // >>> HACK - HMI_WARNING("wm", "HACK!!! mediaplayer and hvac is only supported for split"); - std::string request_role = drawing_name; - //std::string request_app = transform(request_role.begin(), request_role.end(), request_role.begin(), tolower); //hvac or mediaplayer - std::string hack_appid = "navigation"; - std::string hack_role = main; - std::string hack_area = str_area_main; - g_app_list.setAction(g_app_list.currentRequestNumber(), hack_appid, hack_role, hack_area, true); - //g_app_list.setEndDrawFinished(g_app_list.currentRequestNumber(), request_role, request_role); - //g_app_list.setEndDrawFinished(g_app_list.currentRequestNumber(), hack_appid, hack_role); // This process is illegal - // >>> HACK - this->emit_syncdraw(main.c_str(), str_area_main.c_str(), - area_rect_main.x, area_rect_main.y, - area_rect_main.w, area_rect_main.h); - this->emit_syncdraw(request_role.c_str(), str_area_sub.c_str(), - area_rect_sub.x, area_rect_sub.y, - area_rect_sub.w, area_rect_sub.h); - this->enqueue_flushdraw(state.main); - this->enqueue_flushdraw(state.sub); - }); - } - else - { - this->try_layout( - state, LayoutState{*surface_id}, [&](LayoutState const &nl) { - HMI_DEBUG("wm", "Layout: %s", kNameLayoutNormal); - - this->surface_set_layout(*surface_id); - if (state.main != *surface_id) - { - this->deactivate(state.main); - } - if (state.sub != -1) - { - if (state.sub != *surface_id) - { - this->deactivate(state.sub); - } - } - state = nl; - - // Commit for configuraton and visibility(0) - this->layout_commit(); - - std::string str_area = std::string(kNameLayoutNormal) + "." + std::string(kNameAreaFull); - compositor::rect area_rect = this->area_info[*surface_id]; - this->emit_syncdraw(drawing_name, str_area.c_str(), - area_rect.x, area_rect.y, area_rect.w, area_rect.h); - this->enqueue_flushdraw(state.main); - }); - } - } - } -} */ - const char *App::check_surface_exist(const char *drawing_name) { auto const &surface_id = this->lookup_id(drawing_name); @@ -1213,22 +1007,6 @@ void App::check_flushdraw(int surface_id) } } -/* void App::lm_enddraw(const char *drawing_name) -{ - HMI_DEBUG("wm", "end draw %s", drawing_name); - for (unsigned i = 0, iend = this->pending_end_draw.size(); i < iend; i++) - { - auto n = this->lookup_name(this->pending_end_draw[i]); - if (n && *n == drawing_name) - { - std::swap(this->pending_end_draw[i], this->pending_end_draw[iend - 1]); - this->pending_end_draw.resize(iend - 1); - this->activate(this->pending_end_draw[i]); - this->emit_flushdraw(drawing_name); - } - } -} */ - WMError App::doEndDraw(unsigned req_num) { // get actions @@ -1242,12 +1020,8 @@ WMError App::doEndDraw(unsigned req_num) } HMI_SEQ_INFO(req_num, "do endDraw"); - // layout change and make it visible - - // Temporary action - /* auto itr = actions.cend(); - this->currentAppInvisible(itr->role); */ + // layout change and make it visible for (const auto &act : actions) { // layout change @@ -1270,11 +1044,14 @@ WMError App::doEndDraw(unsigned req_num) //this->lm_enddraw(act.role.c_str()); } + // Change current state + this->changeCurrentState(req_num); + HMI_SEQ_INFO(req_num, "emit flushDraw"); for(const auto &act_flush : actions) { - if(act_flush.visible) + if(act_flush.visible != TaskVisible::INVISIBLE) { this->emit_flushdraw(act_flush.role.c_str()); } @@ -1285,26 +1062,6 @@ WMError App::doEndDraw(unsigned req_num) WMError App::setSurfaceSize(unsigned surface, const std::string &area) { - // Actually this function is under Layout Manager - /* compositor::rect size = this->lm.getAreaSize(area); // compositor::rect size = this->lm_.getAreaSize(area); - - if (!this->controller->surface_exists(surface)) - { - // Block until all pending request are processed by wayland display server - // because waiting for the surface of new app is created - this->display->roundtrip(); - } - auto &s = this->controller->surfaces[surface]; - s->set_destination_rectangle(size.x, size.y, size.w, size.h); - this->layout_commit(); - - // Update area information - this->area_info[surface].x = size.x; - this->area_info[surface].y = size.y; - this->area_info[surface].w = size.w; - this->area_info[surface].h = size.h; - HMI_DEBUG("wm", "Surface %d rect { %d, %d, %d, %d }", - surface, size.x, size.y, size.w, size.h); */ this->surface_set_layout(surface); return WMError::SUCCESS; @@ -1312,8 +1069,9 @@ WMError App::setSurfaceSize(unsigned surface, const std::string &area) WMError App::layoutChange(const WMAction &action) { - if (action.visible == false) + if (action.visible == TaskVisible::INVISIBLE) { + // Visibility is not change -> no redraw is required return WMError::SUCCESS; } auto client = g_app_list.lookUpClient(action.appid); @@ -1329,44 +1087,6 @@ WMError App::layoutChange(const WMAction &action) return ret; } -/* void App::currentAppInvisible(const std::string &role) -{ - 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; - - // disable layers that are above our current layer - for (auto const &l : this->layers.mapping) - { - if (l.second.layer_id <= *layer_id) - { - continue; - } - - bool flush = false; - if (l.second.state.main != -1) - { - this->deactivate(l.second.state.main); - l.second.state.main = -1; - flush = true; - } - - if (l.second.state.sub != -1) - { - this->deactivate(l.second.state.sub); - l.second.state.sub = -1; - flush = true; - } - - if (flush) - { - this->layout_commit(); - } - } -} */ - WMError App::visibilityChange(const WMAction &action) { auto client = g_app_list.lookUpClient(action.appid); @@ -1378,7 +1098,7 @@ WMError App::visibilityChange(const WMAction &action) return WMError::NOT_REGISTERED; } - if (action.visible) + if (action.visible != TaskVisible::INVISIBLE) { this->activate(surface); // Layout Manager task } @@ -1389,6 +1109,52 @@ WMError App::visibilityChange(const WMAction &action) return WMError::SUCCESS; } +WMError App::changeCurrentState(unsigned req_num) +{ + HMI_SEQ_DEBUG(req_num, "Change current layout status"); + bool found = false; + auto actions = g_app_list.getActions(req_num, &found); + if(!found) + { + HMI_SEQ_ERROR(req_num, "Action not found"); + return WMError::LAYOUT_CHANGE_FAIL; + } + + struct LayoutState state; + std::vector areas; + bool state_change = false; + + for(const auto &action : actions) + { + if(action.visible != TaskVisible::INVISIBLE) + { + // visible == true -> layout changes + areas.push_back(action.area); + auto client = g_app_list.lookUpClient(action.appid); + if(action.area == "normal.full" || action.area == "split.main") + { + state.main = (int)client->surfaceID(action.role); + } + else if(action.role == "split.sub") + { + state.sub = (int)client->surfaceID(action.role); + } + state_change = true; + } + } + + if(state_change) + { + auto trigger = g_app_list.getRequest(req_num, &found); + auto client = g_app_list.lookUpClient(trigger.appid); + auto pCurState = *this->layers.get_layout_state((int)client->surfaceID(trigger.role)); + struct LayoutState &curState = *pCurState; + curState = state; + } + + return WMError::SUCCESS; +} + void App::api_enddraw(char const *appid, char const *drawing_name) { std::string id = appid; @@ -1541,10 +1307,10 @@ void App::emit_syncdraw(char const *label, char const *area, int x, int y, int w void App::emit_syncdraw(const std::string &role, const std::string &area) { - int x = 0, y = 0, w = 0, h = 0; + compositor::rect rect = this->layers.getAreaSize(area); //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); + role.c_str(), area.c_str(), rect.x, rect.y, rect.w, rect.h); } void App::emit_flushdraw(char const *label) @@ -1724,8 +1490,11 @@ void App::activate(int id) char const *label = this->lookup_name(id).value_or("unknown-name").c_str(); - // FOR CES DEMO >>> - if ((0 == strcmp(label, "Radio")) || (0 == strcmp(label, "MediaPlayer")) || (0 == strcmp(label, "Music")) || (0 == strcmp(label, "Navigation"))) + // FOR CES DEMO >>> + if ((0 == strcmp(label, "Radio")) || + (0 == strcmp(label, "MediaPlayer")) || + (0 == strcmp(label, "Music")) || + (0 == strcmp(label, "Navigation"))) { for (auto i = surface_bg.begin(); i != surface_bg.end(); ++i) {