Add changeCurrentStatus function
[apps/agl-service-windowmanager.git] / src / app.cpp
index 414e1fb..f1c9ed3 100644 (file)
@@ -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<int> 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<std::string> 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)
             {