From a4672ec034586dfc868c9bbf48f5a4082d24172f Mon Sep 17 00:00:00 2001 From: Marcus Fritzsch Date: Wed, 2 Aug 2017 14:13:42 +0200 Subject: [PATCH] app: add surface_set_layout(), call it from genivi::controller late-task Signed-off-by: Marcus Fritzsch --- src/app.cpp | 92 ++++++++++++++++++++++++++++++++++++------------------------- src/app.hpp | 1 + 2 files changed, 55 insertions(+), 38 deletions(-) diff --git a/src/app.cpp b/src/app.cpp index ecfe0cd..e14984e 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -273,6 +273,53 @@ int App::init_layout() { return 0; } +void App::surface_set_layout(uint32_t surface_id) { + auto o_layer_id = this->layers.get_layer_id(surface_id); + + if (!o_layer_id) { + logerror("Surface %d is not associated with any layer!", int(surface_id)); + return; + } + + if (!this->controller->surface_exists(surface_id)) { + logerror("Surface %d does not exist", int(surface_id)); + return; + } + + uint32_t layer_id = o_layer_id.value(); + + auto rect = this->layers.get_layer_rect(surface_id).value(); + auto &s = this->controller->surfaces[surface_id]; + + int x = rect.x; + int y = rect.y; + int w = rect.w; + int h = rect.h; + + // 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; + } + if (h < 0) { + h = this->controller->output_size.h + 1 + h; + } + logdebug("Computed rect={ %d, %d, %d, %d }", x, y, w, h); + + // configure surface to wxh dimensions + s->set_configuration(w, h); + // set source rect to "entire surface" + s->set_source_rectangle(0, 0, w, h); + // set destination to the display rectangle + s->set_destination_rectangle(x, y, w, h); + + s->set_visibility(1); + this->controller->layers[layer_id]->add_surface(s.get()); + + logdebug("Surface %u now on layer %u with rect { %d, %d, %d, %d }", + surface_id, layer_id, x, y, w, h); +} + // _ _ _____ _ // _ __ _ __ _____ _(_) ___ __| | | ____|_ _____ _ __ | |_ ___ // | '_ \| '__/ _ \ \/ / |/ _ \/ _` | | _| \ \ / / _ \ '_ \| __/ __| @@ -281,44 +328,13 @@ int App::init_layout() { // |_| void App::surface_created(uint32_t surface_id) { DB("surface_id is " << surface_id); - int layer_id = this->layers.get_layer_id(surface_id).value_or(-1); - if (layer_id == -1) { - logerror("Surface %d (0x%x) is not part of any layer!", surface_id, - surface_id); - } else { - auto rect = this->layers.get_layer_rect(surface_id).value(); - this->controller->add_task( - "surface setup", - [layer_id, surface_id, rect](struct genivi::controller *c) { - auto &s = c->surfaces[surface_id]; - - int x = rect.x; - int y = rect.y; - int w = rect.w; - int h = rect.h; - - // less-than-0 values refer to MAX + 1 - $VALUE - // e.g. MAX is either screen width or height - if (w < 0) { - w = c->output_size.w + 1 + w; - } - if (h < 0) { - h = c->output_size.h + 1 + h; - } - logdebug("Computed rect={ %d, %d, %d, %d }", x, y, w, h); - - // configure surface to wxh dimensions - s->set_configuration(w, h); - // set source rect to "entire surface" - s->set_source_rectangle(0, 0, w, h); - // set destination to the display rectangle - s->set_destination_rectangle(x, y, w, h); - - s->set_visibility(1); - c->layers[layer_id]->add_surface(s.get()); - logdebug("Surface %u now on layer %u", surface_id, layer_id); - }); - } + + // We need to execute the surface setup after its creation. + // XXX: perhaps move the late-tasks functionality to App? + this->controller->add_task("surface_set_layout", + [surface_id, this](struct genivi::controller *) { + this->surface_set_layout(surface_id); + }); } void App::surface_removed(uint32_t surface_id) { diff --git a/src/app.hpp b/src/app.hpp index ce2e670..63334b3 100644 --- a/src/app.hpp +++ b/src/app.hpp @@ -66,6 +66,7 @@ struct App { int init(); int dispatch_events(); int init_layout(); + void surface_set_layout(uint32_t surface_id); void surface_created(uint32_t surface_id); void surface_removed(uint32_t surface_id); -- 2.16.6