From 08b73681b0ea6206fc6dc96575ac3e8d6006bc70 Mon Sep 17 00:00:00 2001 From: Yuta Doi Date: Mon, 23 Oct 2017 23:39:52 +0900 Subject: Modify the waiting loop of the ivi configuration listener When layout is NOT normal, wait for the listener. Change-Id: Iedbb5de7a997c82613a0e1947d91ee2527f28436 Signed-off-by: Yuta Doi --- src/app.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++++++++-------- src/layers.cpp | 10 +++++++++ src/layers.hpp | 7 ++++-- src/wayland.cpp | 1 + src/wayland.hpp | 2 ++ 5 files changed, 79 insertions(+), 11 deletions(-) diff --git a/src/app.cpp b/src/app.cpp index 4de7b03..a5583ae 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -319,6 +319,7 @@ void App::layout_commit() { char const *App::api_activate_surface(char const *drawing_name, char const *drawing_area) { ST(); + auto const &surface_id = this->lookup_id(drawing_name); if (!surface_id) { @@ -367,36 +368,68 @@ char const *App::api_activate_surface(char const *drawing_name, char const *draw } } - if (state.main == *surface_id || state.sub == *surface_id) { - return "Surface already active"; - } + 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(); + + if (!(layer->is_normal_layout_only)) { + // Wait for configuration listener + controller->is_configured = false; + while (!(controller->is_configured)) { + dispatch_pending_events(); + } + } + std::string str_area = std::string(kNameLayoutNormal) + "." + std::string(kNameAreaFull); this->emit_syncdraw(drawing_name, str_area.c_str()); this->enqueue_flushdraw(state.main); }); } else { - bool can_split = this->can_split(state, *surface_id); + 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); + this->emit_syncdraw(drawing_name, str_area.c_str()); + 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 != -1) { - this->deactivate(state.sub); + if (state.sub != *surface_id) { + if (state.sub != -1) { + this->deactivate(state.sub); + } } state = nl; + // Commit for configuraton and visibility(0) + this->layout_commit(); + + // Wait for configuration listener + controller->is_configured = false; + while (!(controller->is_configured)) { + dispatch_pending_events(); + } + std::string str_area_main = std::string(kNameLayoutSplit) + "." + std::string(kNameAreaMain); std::string str_area_sub = std::string(kNameLayoutSplit) + "." + std::string(kNameAreaSub); this->emit_syncdraw(main.c_str(), str_area_main.c_str()); @@ -407,19 +440,36 @@ char const *App::api_activate_surface(char const *drawing_name, char const *draw } else { this->try_layout( state, LayoutState{*surface_id}, [&] (LayoutState const &nl) { + HMI_DEBUG("wm", "Layout: %s", kNameLayoutNormal); + this->surface_set_layout(*surface_id); - this->deactivate(state.main); + if (state.main != *surface_id) { + this->deactivate(state.main); + } if (state.sub != -1) { - this->deactivate(state.sub); + if (state.sub != *surface_id) { + this->deactivate(state.sub); + } } state = nl; + // Commit for configuraton and visibility(0) + this->layout_commit(); + + if (!(layer->is_normal_layout_only)) { + // Wait for configuration listener + controller->is_configured = false; + while (!(controller->is_configured)) { + dispatch_pending_events(); + } + } std::string str_area = std::string(kNameLayoutNormal) + "." + std::string(kNameAreaFull); this->emit_syncdraw(drawing_name, str_area.c_str()); this->enqueue_flushdraw(state.main); }); } + } } // no error @@ -636,7 +686,9 @@ result App::api_request_surface(char const *drawing_name) { void App::activate(int id) { auto ip = this->controller->sprops.find(id); - if (ip != this->controller->sprops.end() && ip->second.visibility == 0) { + if (ip != this->controller->sprops.end()) { + this->controller->surfaces[id]->set_visibility(0); + this->layout_commit(); this->controller->surfaces[id]->set_visibility(1); char const *label = this->lookup_name(id).value_or("unknown-name").c_str(); diff --git a/src/layers.cpp b/src/layers.cpp index 2150440..fe95495 100644 --- a/src/layers.cpp +++ b/src/layers.cpp @@ -37,8 +37,16 @@ layer::layer(nlohmann::json const &j) { jr["width"], jr["height"], jr["x"], jr["y"], }; } + + // Init flag of normal layout only + this->is_normal_layout_only = true; + auto split_layouts = j.find("split_layouts"); if (split_layouts != j.end()) { + + // Clear flag of normal layout only + this->is_normal_layout_only = false; + auto &sls = j["split_layouts"]; // this->layouts.reserve(sls.size()); std::transform(std::cbegin(sls), std::cend(sls), @@ -53,6 +61,8 @@ layer::layer(nlohmann::json const &j) { return l; }); } + HMI_DEBUG("wm", "layer_id:%d is_normal_layout_only:%d\n", + this->layer_id, this->is_normal_layout_only); } struct result to_layer_map(nlohmann::json const &j) { diff --git a/src/layers.hpp b/src/layers.hpp index 0603d24..63650b4 100644 --- a/src/layers.hpp +++ b/src/layers.hpp @@ -52,11 +52,14 @@ struct layer { // Specify a role prefix for surfaces that should be // put on this layer. std::string role; - // XXX perhaps a zorder is needed here? + // TODO: perhaps a zorder is needed here? std::vector layouts; - // XXX need to change the way we store these things... + mutable struct LayoutState state; + // Flag of normal layout only + bool is_normal_layout_only; + explicit layer(nlohmann::json const &j); json to_json() const; diff --git a/src/wayland.cpp b/src/wayland.cpp index c565a92..1d0f5a8 100644 --- a/src/wayland.cpp +++ b/src/wayland.cpp @@ -656,6 +656,7 @@ void controller::surface_configuration(struct surface *s, int32_t width, HMI_DEBUG("wm", "genivi::surface %s @ %d w %i h %i", __func__, s->id, width, height); this->sprops[s->id].size = size{uint32_t(width), uint32_t(height)}; + is_configured = true; } void controller::surface_orientation(struct surface *s, int32_t orientation) { diff --git a/src/wayland.hpp b/src/wayland.hpp index 61a840d..f6d17b4 100644 --- a/src/wayland.hpp +++ b/src/wayland.hpp @@ -288,6 +288,8 @@ struct controller : public wayland_proxy { wm::controller_hooks *chooks; + bool is_configured; + void add_proxy_to_id_mapping(struct ivi_controller_surface *p, uint32_t id); void remove_proxy_to_id_mapping(struct ivi_controller_surface *p); void add_proxy_to_id_mapping(struct ivi_controller_layer *p, uint32_t id); -- cgit 1.2.3-korg