Enable scaling to fit various screen resolutions
[apps/agl-service-windowmanager.git] / src / app.cpp
index e9d79f5..575ab85 100644 (file)
@@ -58,7 +58,6 @@ const char kKeyHeightPixel[] = "height_pixel";
 const char kKeyWidthMm[]     = "width_mm";
 const char kKeyHeightMm[]    = "height_mm";
 
-
 namespace {
 
 using nlohmann::json;
@@ -114,6 +113,10 @@ App::App(wl::display *d)
          } else {
             HMI_ERROR("wm", "%s", l.err().value());
          }
+
+         if (this->config.get_string("scaling_ignore_aspect")) {
+             this->layers.scaling_keep_aspect =false;
+         }
       }
    } catch (std::exception &e) {
       HMI_ERROR("wm", "Loading of configuration failed: %s", e.what());
@@ -237,11 +240,22 @@ int App::init_layers() {
    // Clear screen
    s->clear();
 
+   int width = this->layers.main_surface_width;
+   int height = this->layers.main_surface_height;
+
+   rectangle rect(width, height); // 1080x1920 by default
+   rect.scale(o->width, o->height, this->layers.scaling_keep_aspect);
+   rect.center(o->width, o->height);
+
+   HMI_DEBUG("wm", "Main surface (0,0),%dx%d to (%d,%d),%dx%d",
+             width, height, rect.left(), rect.top(), rect.width(), rect.height());
+
    // Quick and dirty setup of layers
    for (auto const &i : this->layers.mapping) {
-      c->layer_create(i.second.layer_id, o->width, o->height);
+      c->layer_create(i.second.layer_id, rect.width(), rect.height());
       auto &l = layers[i.second.layer_id];
-      l->set_destination_rectangle(0, 0, o->width, o->height);
+      l->set_source_rectangle(0, 0, width, height);
+      l->set_destination_rectangle(rect.left(), rect.top(), rect.width(), rect.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());
@@ -282,10 +296,10 @@ void App::surface_set_layout(int surface_id, optional<int> sub_surface_id) {
    // less-than-0 values refer to MAX + 1 - $VALUE
    // e.g. MAX is either screen width or height
    if (w < 0) {
-      w = this->controller->output_size.w + 1 + w;
+      w = this->layers.main_surface_width + 1 + w;
    }
    if (h < 0) {
-      h = this->controller->output_size.h + 1 + h;
+      h = this->layers.main_surface_height + 1 + h;
    }
 
    if (sub_surface_id) {