X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fapp.cpp;h=f1c9ed37a24fd14483ae5ceffb428c3dde1544e7;hb=5ae7f0df360a72a42b4722cbffddd169da21b4d0;hp=414e1fb1ab34f7f0685f06c378cc05d5c8d261f1;hpb=aae4a578e9c23a7418053fdc15599f0c19fc7f17;p=apps%2Fagl-service-windowmanager.git diff --git a/src/app.cpp b/src/app.cpp index 414e1fb..f1c9ed3 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"); @@ -866,162 +816,6 @@ WMError App::setInvisibleTask(const std::string &role, bool split) 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,6 +1044,9 @@ 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) @@ -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; @@ -1329,44 +1086,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); @@ -1389,6 +1108,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) + { + // 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 +1306,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 +1489,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) {