Dump visible task
[apps/agl-service-windowmanager.git] / src / app.cpp
index 414e1fb..0c89804 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");
@@ -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<std::string> 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)
             {