Merge changes from topic '15921'
[apps/agl-service-windowmanager-2017.git] / src / window_manager.cpp
index 15f55f0..aa42d82 100644 (file)
@@ -19,7 +19,6 @@
 
 #include "window_manager.hpp"
 #include "json_helper.hpp"
-#include "wm_config.hpp"
 #include "applist.hpp"
 
 extern "C"
@@ -51,6 +50,7 @@ const char kKeyWidthPixel[]  = "width_pixel";
 const char kKeyHeightPixel[] = "height_pixel";
 const char kKeyWidthMm[]     = "width_mm";
 const char kKeyHeightMm[]    = "height_mm";
+const char kKeyScale[]       = "scale";
 const char kKeyIds[]         = "ids";
 
 static sd_event_source *g_timer_ev_src = nullptr;
@@ -147,7 +147,6 @@ WindowManager::WindowManager(wl::display *d)
 
 int WindowManager::init()
 {
-    int ret;
     if (!this->display->ok())
     {
         return -1;
@@ -185,12 +184,12 @@ int WindowManager::init()
 
             // This protocol needs the output, so lets just add our mapping here...
             this->controller->add_proxy_to_id_mapping(
-                this->outputs.back()->proxy.get(),
+                this->outputs.front()->proxy.get(),
                 wl_proxy_get_id(reinterpret_cast<struct wl_proxy *>(
-                    this->outputs.back()->proxy.get())));
+                    this->outputs.front()->proxy.get())));
 
             // Create screen
-            this->controller->create_screen(this->outputs.back()->proxy.get());
+            this->controller->create_screen(this->outputs.front()->proxy.get());
 
             // Set display to controller
             this->controller->display = this->display;
@@ -203,8 +202,7 @@ int WindowManager::init()
     // Third level objects
     this->display->roundtrip();
 
-    ret = init_layers();
-    return ret;
+    return init_layers();
 }
 
 int WindowManager::dispatch_pending_events()
@@ -238,7 +236,7 @@ result<int> WindowManager::api_request_surface(char const *appid, char const *dr
         HMI_DEBUG("wm", "%s is not registered in layers.json, then fallback as normal app", role);
         if (!lid)
         {
-            return Err<int>("Drawing name does not match any role, Fallback is disabled");
+            return Err<int>("Drawing name does not match any role, fallback is disabled");
         }
     }
 
@@ -292,7 +290,7 @@ char const *WindowManager::api_request_surface(char const *appid, char const *dr
         HMI_DEBUG("wm", "%s is not registered in layers.json, then fallback as normal app", role);
         if (!lid)
         {
-            return "Drawing name does not match any role, Fallback is disabled";
+            return "Drawing name does not match any role, fallback is disabled";
         }
     }
 
@@ -463,10 +461,9 @@ void WindowManager::api_enddraw(char const *appid, char const *drawing_name)
 
 result<json_object *> WindowManager::api_get_display_info()
 {
-    // Check controller
-    if (!this->controller)
+    if (!this->display->ok())
     {
-        return Err<json_object *>("ivi_controller global not available");
+        return Err<json_object *>("Wayland compositor is not available");
     }
 
     // Set display info
@@ -478,6 +475,7 @@ result<json_object *> WindowManager::api_get_display_info()
     json_object_object_add(object, kKeyHeightPixel, json_object_new_int(o_size.h));
     json_object_object_add(object, kKeyWidthMm, json_object_new_int(p_size.w));
     json_object_object_add(object, kKeyHeightMm, json_object_new_int(p_size.h));
+    json_object_object_add(object, kKeyScale, json_object_new_double(this->controller->scale));
 
     return Ok<json_object *>(object);
 }
@@ -576,6 +574,8 @@ void WindowManager::send_event(char const *evname, char const *label, char const
  */
 void WindowManager::surface_created(uint32_t surface_id)
 {
+    this->controller->get_surface_properties(surface_id, IVI_WM_PARAM_SIZE);
+
     auto layer_id = this->layers.get_layer_id(surface_id);
     if (!layer_id)
     {
@@ -657,27 +657,32 @@ int WindowManager::init_layers()
         return -1;
     }
 
-    WMConfig wm_config;
-    wm_config.loadConfigs();
-
     auto &c = this->controller;
 
     auto &o = this->outputs.front();
     auto &s = c->screens.begin()->second;
     auto &layers = c->layers;
 
-    this->layers.loadAreaDb();
-    const compositor::rect base = this->layers.getAreaSize("fullscreen");
-
-    const std::string aspect_setting = wm_config.getConfigAspect();
-    const compositor::rect scale_rect =
-        this->layers.getScaleDestRect(o->width, o->height, aspect_setting);
-
     // Write output dimensions to ivi controller...
     c->output_size = compositor::size{uint32_t(o->width), uint32_t(o->height)};
     c->physical_size = compositor::size{uint32_t(o->physical_width),
                                         uint32_t(o->physical_height)};
 
+
+    HMI_DEBUG("wm", "SCALING: screen (%dx%d), physical (%dx%d)",
+              o->width, o->height, o->physical_width, o->physical_height);
+
+    this->layers.loadAreaDb();
+
+    const compositor::rect css_bg = this->layers.getAreaSize("fullscreen");
+    rectangle dp_bg(o->width, o->height);
+
+    dp_bg.set_aspect(static_cast<double>(css_bg.w) / css_bg.h);
+    dp_bg.fit(o->width, o->height);
+    dp_bg.center(o->width, o->height);
+    HMI_DEBUG("wm", "SCALING: CSS BG(%dx%d) -> DDP %dx%d,(%dx%d)",
+              css_bg.w, css_bg.h, dp_bg.left(), dp_bg.top(), dp_bg.width(), dp_bg.height());
+
     // Clear scene
     layers.clear();
 
@@ -687,11 +692,9 @@ int WindowManager::init_layers()
     // Quick and dirty setup of layers
     for (auto const &i : this->layers.mapping)
     {
-        c->layer_create(i.second.layer_id, scale_rect.w, scale_rect.h);
+        c->layer_create(i.second.layer_id, dp_bg.width(), dp_bg.height());
         auto &l = layers[i.second.layer_id];
-        l->set_source_rectangle(0, 0, base.w, base.h);
-        l->set_destination_rectangle(
-            scale_rect.x, scale_rect.y, scale_rect.w, scale_rect.h);
+        l->set_destination_rectangle(dp_bg.left(), dp_bg.top(), dp_bg.width(), dp_bg.height());
         l->set_visibility(1);
         HMI_DEBUG("wm", "Setting up layer %s (%d) for surface role match \"%s\"",
                   i.second.name.c_str(), i.second.layer_id, i.second.role.c_str());
@@ -702,6 +705,9 @@ int WindowManager::init_layers()
 
     this->layout_commit();
 
+    c->scale = static_cast<double>(dp_bg.height()) / css_bg.h;
+    this->layers.setupArea(c->scale);
+
     return 0;
 }
 
@@ -738,8 +744,6 @@ void WindowManager::surface_set_layout(int surface_id, const std::string& area)
               layer_id);
 
     // set destination to the display rectangle
-    s->set_source_rectangle(0, 0, w, h);
-    this->layout_commit();
     s->set_destination_rectangle(x, y, w, h);
 
     // update area information
@@ -1102,6 +1106,15 @@ WMError WindowManager::setInvisibleTask(const std::string &role, bool split)
 {
     unsigned req_num = g_app_list.currentRequestNumber();
     HMI_SEQ_DEBUG(req_num, "set current visible app to invisible task");
+    bool found = false;
+    auto trigger = g_app_list.getRequest(req_num, &found);
+    // I don't check found == true here because this is checked in caller.
+    if(trigger.role == "homescreen")
+    {
+        HMI_SEQ_INFO(req_num, "In case of 'homescreen' visible, don't change app to invisible");
+        return WMError::SUCCESS;
+    }
+
     // This task is copied from original actiavete surface
     const char *drawing_name = this->rolenew2old[role].c_str();
     auto const &surface_id = this->lookup_id(role.c_str());
@@ -1113,7 +1126,6 @@ WMError WindowManager::setInvisibleTask(const std::string &role, bool split)
     int surface;
     TaskVisible task_visible = TaskVisible::INVISIBLE;
     bool end_draw_finished = true;
-    bool found = false;
 
     for (auto const &l : this->layers.mapping)
     {
@@ -1280,6 +1292,7 @@ WMError WindowManager::doEndDraw(unsigned req_num)
         HMI_SEQ_DEBUG(req_num, "visible %s", act.role.c_str());
         //this->lm_enddraw(act.role.c_str());
     }
+    this->layout_commit();
 
     // Change current state
     this->changeCurrentState(req_num);
@@ -1449,7 +1462,6 @@ void WindowManager::emitScreenUpdated(unsigned req_num)
     {
         HMI_DEBUG("wm", "afb_event_push failed: %m");
     }
-    json_object_put(jarray);
 }
 
 void WindowManager::setTimer()
@@ -1760,12 +1772,12 @@ const char* WindowManager::kDefaultOldRoleDb = "{ \
  */
 void controller_hooks::surface_created(uint32_t surface_id)
 {
-    this->app->surface_created(surface_id);
+    this->wmgr->surface_created(surface_id);
 }
 
 void controller_hooks::surface_removed(uint32_t surface_id)
 {
-    this->app->surface_removed(surface_id);
+    this->wmgr->surface_removed(surface_id);
 }
 
 void controller_hooks::surface_visibility(uint32_t /*surface_id*/,