#include <fstream>
#include <json.hpp>
+#include <bits/signum.h>
+#include <csignal>
namespace wm {
DB(j);
auto &ja = j["areas"];
- auto l = wm::layout{j["name"].get<std::string>(), uint32_t(ja.size()), {}};
+ auto l = layout{j["name"].get<std::string>(), uint32_t(ja.size()), {}};
if (ja.size() > layout::MAX_N_AREAS) {
return Err<struct layout>("Invalid number of areas in layout");
// \___|_|\__,_|___/___/ /_/ \_\ .__/| .__/ |_|_| |_| |_| .__/|_|
// |_| |_| |_|
App::App(wl::display *d)
- : api{this}, chooks{this}, display{d}, controller{} {
+ : api{this},
+ chooks{this},
+ display{d},
+ controller{},
+ outputs(),
+ layouts(load_layout("../layout.json").unwrap()),
+ surface2layer(load_layer_ids("../ids.json").unwrap()) {
// layouts(load_layout("../layout.json").unwrap()) {
assert(g_app == nullptr);
g_app = this;
-
- auto a = load_layout("../layout.json");
- auto b = a.map_err([](char const *e) -> char const * {
- DB("Could not load layout: " << e);
- return e;
- });
-
- auto c = load_layer_ids("../ids.json");
- auto e = c.map_err([](char const *e) -> char const * {
- DB("Could not load ids: " << e);
- return e;
- });
}
App::~App() { g_app = nullptr; }
// Clear screen
s->clear();
- // Setup our dummy scene...
- c->layer_create(100, 0, 0); // bottom layer, anything else
- c->layer_create(1000, 0, 0); // top layer, mandelbrot
-
- auto &l100 = c->layers[100];
- auto &l1k = c->layers[1000];
-
- // Set layers fullscreen
- l100->set_destination_rectangle(0, 0, o->width, o->height);
- l1k->set_destination_rectangle(0, 0, o->width, o->height);
- l100->set_visibility(1);
- l1k->set_visibility(1);
+ // Quick and dirty setup of layers
+ // XXX: This likely needs to be sorted by order (note, we don't (yet?)
+ // do any zorder arrangement).
+ for (auto const &i : this->surface2layer.mapping) {
+ c->layer_create(i.layer_id, o->width, o->height);
+ auto &l = layers[i.layer_id];
+ l->set_destination_rectangle(0, 0, o->width, o->height);
+ l->set_visibility(1);
+ logdebug("Setting up layer %s (%d) for surfaces %d-%d", i.name.c_str(),
+ i.layer_id, i.id_min, i.id_max);
+ }
- // Add layers to screen
- s->set_render_order({100, 1000});
+ // Add layers to screen (XXX: are they sorted correctly?)
+ s->set_render_order(this->surface2layer.layers);
c->commit_changes();
return 0;
}
+// _ _ _____ _
+// _ __ _ __ _____ _(_) ___ __| | | ____|_ _____ _ __ | |_ ___
+// | '_ \| '__/ _ \ \/ / |/ _ \/ _` | | _| \ \ / / _ \ '_ \| __/ __|
+// | |_) | | | (_) > <| | __/ (_| | | |___ \ V / __/ | | | |_\__ \
+// | .__/|_| \___/_/\_\_|\___|\__,_| |_____| \_/ \___|_| |_|\__|___/
+// |_|
void App::surface_created(uint32_t surface_id) {
DB("surface_id is " << surface_id);
- this->controller->add_task("fullscreen surface", [surface_id](struct genivi::controller *c) {
- auto &s = c->surfaces[surface_id];
- s->set_destination_rectangle(0, 0, c->output_size.w, c->output_size.h);
- s->set_visibility(1);
- uint32_t lid = surface_id == 0x16180 ? 1000 : 100;
- c->layers[lid]->add_surface(s.get());
- logdebug("Surface %u now fullscreen on layer %u", surface_id, lid);
- });
+ int layer_id =
+ this->surface2layer.get_layer_for_surface(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 {
+ this->controller->add_task(
+ "fullscreen surface",
+ [layer_id, surface_id](struct genivi::controller *c) {
+ auto &s = c->surfaces[surface_id];
+ // s->set_destination_rectangle(0, 0, c->output_size.w, c->output_size.h);
+ // s->set_source_rectangle(0, 100, c->output_size.w, c->output_size.h - 200);
+ if (layer_id != 1000) {
+ // s->set_source_rectangle(0, 0, c->output_size.w, c->output_size.h - 200);
+ s->set_configuration(c->output_size.w, c->output_size.h - 200);
+ s->set_destination_rectangle(0, 100, c->output_size.w,
+ c->output_size.h - 200);
+ } else {
+ // s->set_source_rectangle(0, 0, c->output_size.w, c->output_size.h);
+ s->set_configuration(c->output_size.w, c->output_size.h);
+ s->set_destination_rectangle(0, 0, c->output_size.w,
+ c->output_size.h);
+ }
+ s->set_visibility(1);
+ c->layers[layer_id]->add_surface(s.get());
+ logdebug("Surface %u now on layer %u", surface_id,
+ layer_id);
+ });
+ }
}
void App::surface_removed(uint32_t surface_id) {
return Ok(jr);
}
+binding_api::result_type binding_api::debug_terminate() {
+ logdebug("%s", __func__);
+ raise(SIGKILL); // XXX afb-daemon kills it's pgroup using TERM, which doesn't play well with perf
+ return Ok(json_object_new_object());
+}
+
// _ _ _ _ _
// ___ ___ _ __ | |_ _ __ ___ | | | ___ _ __ | |__ ___ ___ | | _____
// / __/ _ \| '_ \| __| '__/ _ \| | |/ _ \ '__|| '_ \ / _ \ / _ \| |/ / __|