Bug fix: Refer removed surface id in vector of pending_end_draw
[apps/agl-service-windowmanager.git] / src / app.cpp
index 47f18aa..23d3a2c 100644 (file)
@@ -96,7 +96,7 @@ struct result<layer_map> load_layer_map(char const *filename) {
 
 namespace rm {
 App *context;
-const char *g_new_role; // TODO: workaround
+std::string g_new_role; // TODO: workaround
 static void eventHandler(json_object* json_out) {
     context->updateWindowResource(json_out);
 }
@@ -104,7 +104,7 @@ static void eventHandler(json_object* json_out) {
 
 
 void App::updateWindowResource(json_object* json_out) {
-    HMI_DEBUG("wm", "role:%s", rm::g_new_role);
+    HMI_DEBUG("wm", "role:%s", rm::g_new_role.c_str());
 
     // Check parking brake state
     json_object* json_parking_brake;
@@ -247,14 +247,12 @@ void App::updateWindowResource(json_object* json_out) {
     // Get category
     const char* category = nullptr;
     std::string str_category;
-    if (nullptr != rm::g_new_role) {
-        str_category = this->pm_.roleToCategory(rm::g_new_role);
-        category = str_category.c_str();
-        HMI_DEBUG("wm", "role:%s category:%s", rm::g_new_role, category);
-    }
+    str_category = this->pm_.roleToCategory(rm::g_new_role.c_str());
+    category = str_category.c_str();
+    HMI_DEBUG("wm", "role:%s category:%s", rm::g_new_role.c_str(), category);
 
     // Update layout
-    if (this->lm_.updateLayout(json_out, rm::g_new_role, category)) {
+    if (this->lm_.updateLayout(json_out, rm::g_new_role.c_str(), category)) {
         HMI_DEBUG("wm", "Layer is changed!!");
 
         // Allocate surface
@@ -526,7 +524,15 @@ void App::allocateWindowResource(char const *event, char const *drawing_name,
     if (nullptr != new_area) {
         json_object_object_add(json_in, "area", json_object_new_string(new_area));
     }
-    rm::g_new_role = new_role;  // TODO: workaround
+
+    // TODO: workaround
+    if (nullptr != new_role) {
+        rm::g_new_role = std::string(new_role);
+    }
+    else {
+        rm::g_new_role = std::string("");
+    }
+
     this->pm_.inputEvent(json_in);
 
     // Release json_object
@@ -561,10 +567,12 @@ void App::api_enddraw(char const *appid, char const *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]);
+      int surface_id = this->pending_end_draw[i];
+
       if (n && *n == role) {
          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->activate(surface_id);
          this->emit_flushdraw(drawing_name);
          this->emitScreenUpdated(appid);
       }
@@ -746,6 +754,7 @@ void App::emitScreenUpdated(char const* appid) {
 result<int> App::api_request_surface(char const *drawing_name) {
    // Convert drawing_name to role
    const char* role = this->convertDrawingNameToRole(drawing_name);
+
    auto lid = this->layers.get_layer_id(std::string(role));
    if (!lid) {
       /**
@@ -787,8 +796,10 @@ result<int> App::api_request_surface(char const *drawing_name) {
 char const *App::api_request_surface(char const *drawing_name,
                                      char const *ivi_id) {
    ST();
+   // Convert drawing_name to role
+   const char* role = this->convertDrawingNameToRole(drawing_name);
 
-   auto lid = this->layers.get_layer_id(std::string(drawing_name));
+   auto lid = this->layers.get_layer_id(std::string(role));
    unsigned sid = std::stol(ivi_id);
 
    if (!lid) {
@@ -802,14 +813,14 @@ char const *App::api_request_surface(char const *drawing_name,
       }
    }
 
-   auto rname = this->lookup_id(drawing_name);
+   auto rname = this->lookup_id(role);
 
    if (rname) {
        return "Surface already present";
    }
 
    // register pair drawing_name and ivi_id
-   this->id_alloc.register_name_id(drawing_name, sid);
+   this->id_alloc.register_name_id(role, sid);
    this->layers.add_surface(sid, *lid);
 
    // this surface is already created
@@ -1179,13 +1190,13 @@ void App::setSurfaceSize(const char* role, const char* area) {
     HMI_DEBUG("wm", "Surface rect { %d, %d, %d, %d }",
               size.x, size.y, size.w, size.h);
 
+    // Enqueue flushDraw event
+    this->enqueue_flushdraw(surface_id);
+
     // Emit syncDraw event
     const char* drawing_name = this->role2drawingname_[role].c_str();
     this->emit_syncdraw(drawing_name, area,
                         size.x, size.y, size.w, size.h);
-
-    // Enqueue flushDraw event
-    this->enqueue_flushdraw(surface_id);
 }
 
 void App::setAccelPedalPos(double val) {