Modify the waiting loop of the ivi configuration listener
authorYuta Doi <yuta-d@witz-inc.co.jp>
Mon, 23 Oct 2017 14:39:52 +0000 (23:39 +0900)
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>
Wed, 1 Nov 2017 11:03:36 +0000 (11:03 +0000)
When layout is NOT normal, wait for the listener.

Change-Id: Iedbb5de7a997c82613a0e1947d91ee2527f28436
Signed-off-by: Yuta Doi <yuta-d@witz-inc.co.jp>
src/app.cpp
src/layers.cpp
src/layers.hpp
src/wayland.cpp
src/wayland.hpp

index 4de7b03..a5583ae 100644 (file)
@@ -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<int> 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();
index 2150440..fe95495 100644 (file)
@@ -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<struct layer_map> to_layer_map(nlohmann::json const &j) {
index 0603d24..63650b4 100644 (file)
@@ -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<struct split_layout> 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;
index c565a92..1d0f5a8 100644 (file)
@@ -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) {
index 61a840d..f6d17b4 100644 (file)
@@ -288,6 +288,8 @@ struct controller : public wayland_proxy<struct ivi_controller> {
 
    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);