diff options
author | Marcus Fritzsch <marcus_fritzsch@mentor.com> | 2017-08-02 14:13:42 +0200 |
---|---|---|
committer | Marcus Fritzsch <marcus_fritzsch@mentor.com> | 2017-08-08 17:24:00 +0200 |
commit | a4672ec034586dfc868c9bbf48f5a4082d24172f (patch) | |
tree | 57ebe0b1585650850944fc7a82672a0a0258dad3 /src | |
parent | a9215145dd85f9245accda557f3b92e34d016107 (diff) |
app: add surface_set_layout(), call it from genivi::controller late-task
Signed-off-by: Marcus Fritzsch <marcus_fritzsch@mentor.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/app.cpp | 92 | ||||
-rw-r--r-- | 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); |