Fix app surface is set to position (0, 0) 17/18417/2
authorKazumasa Mitsunari <knimitz@witz-inc.co.jp>
Thu, 29 Nov 2018 12:30:33 +0000 (21:30 +0900)
committerKazumasa Mitsunari <knimitz@witz-inc.co.jp>
Mon, 3 Dec 2018 04:09:11 +0000 (13:09 +0900)
Sometimes, ivi_wm_surface_size signal doesn't reach WM.
In that time, surface is not placed in the set place.
This patch fix the issue.

Change-Id: Id7137557d5aaae373fedbb70379179ab50205c60
Signed-off-by: Kazumasa Mitsunari <knimitz@witz-inc.co.jp>
src/window_manager.cpp
src/wm_client.cpp
src/wm_client.hpp
src/wm_layer_control.cpp

index 5dc22be..77d41b7 100644 (file)
@@ -288,7 +288,6 @@ void WindowManager::api_activate_window(char const *appid, char const *drawing_n
     }
 
      // Do allocate tasks
-    
     ret = this->checkPolicy(req_num);
 
     if (ret != WMError::SUCCESS)
index 040c52b..3edf850 100644 (file)
@@ -39,7 +39,7 @@ static const char kKeyError[] = "error";
 static const char kKeyErrorDesc[] = "kErrorDescription";
 
 WMClient::WMClient(const string &appid, unsigned layer, unsigned surface, const string &role)
-    : id(appid), layer(layer),
+    : id(appid), layer(layer), is_source_set(false),
       role2surface(0)
 {
     role2surface[role] = surface;
@@ -57,6 +57,7 @@ WMClient::WMClient(const string &appid, unsigned layer, unsigned surface, const
 WMClient::WMClient(const string &appid, const string &role)
     : id(appid),
       layer(0),
+      is_source_set(false),
       role2surface(0),
       evname2list(0)
 {
@@ -136,6 +137,16 @@ WMError WMClient::addSurface(unsigned surface)
     return (err == ILM_SUCCESS) ? WMError::SUCCESS : WMError::FAIL;
 }
 
+void WMClient::setSurfaceSizeCorrectly()
+{
+    this->is_source_set = true;
+}
+
+bool WMClient::isSourceSizeSet()
+{
+    return this->is_source_set;
+}
+
 bool WMClient::removeSurfaceIfExist(unsigned surface)
 {
     bool ret = false;
index 9568324..53383fb 100644 (file)
@@ -53,6 +53,8 @@ class WMClient
     unsigned surfaceID() const;
     void registerSurface(unsigned surface);
     WMError addSurface(unsigned surface);
+    bool isSourceSizeSet();
+    void setSurfaceSizeCorrectly();
     bool removeSurfaceIfExist(unsigned surface);
 
 #if GTEST_ENABLED
@@ -65,6 +67,7 @@ class WMClient
   private:
     std::string id;
     unsigned layer;
+    bool is_source_set;
     std::string main_role;
     std::string area;
     unsigned surface; // currently, main application has only one surface.
index 011402d..17443de 100644 (file)
@@ -394,7 +394,22 @@ WMError LayerControl::layoutChange(const WMAction& action)
 
     auto rect = this->getAreaSize(action.area);
     HMI_DEBUG("Set layout %d, %d, %d, %d",rect.x, rect.y, rect.w, rect.h);
-    ilm_commitChanges();
+
+    // Sometimes, ivi_wm_surface_size signal doesn't reach window manager,
+    // then, Window Manager set set source size = 0.
+    if(!action.client->isSourceSizeSet())
+    {
+        ilmSurfaceProperties sp;
+        ilm_getPropertiesOfSurface(surface, &sp);
+        if((sp.origSourceHeight != sp.sourceHeight) || (sp.origSourceWidth != sp.sourceWidth))
+        {
+            HMI_SEQ_NOTICE(action.req_num, "set source size w:%d h%d", sp.origSourceWidth, sp.origSourceHeight);
+            ilm_surfaceSetSourceRectangle(surface, 0, 0, sp.origSourceWidth, sp.origSourceHeight);
+            ilm_commitChanges();
+            action.client->setSurfaceSizeCorrectly();
+        }
+    }
+
     ilm_surfaceSetDestinationRectangle(surface, rect.x, rect.y, rect.w, rect.h);
     ilm_commitChanges();
     for(auto &wm_layer: this->wm_layers)