#include <json-c/json.h>
-#include <fstream>
-#include <json.hpp>
#include <bits/signum.h>
#include <csignal>
+#include <fstream>
+#include <json.hpp>
namespace wm {
return Ok(l);
}
+result<json> file_to_json(char const *filename) {
+ std::ifstream i(filename);
+ if (i.fail()) {
+ return Err<json>("Could not open config file");
+ }
+ json j;
+ i >> j;
+ return Ok(j);
+}
+
struct result<layouts_type> load_layout(char const *filename) {
DB("loading layout from " << filename);
- json jlayouts;
- std::ifstream i(filename);
- i >> jlayouts;
+ auto j = file_to_json(filename);
+ if (j.is_err()) {
+ return Err<layouts_type>(j.unwrap_err());
+ }
+ json jlayouts = j.unwrap();
auto layouts = layouts_type();
layouts.reserve(jlayouts.size());
return Ok(layouts);
}
-struct result<surface_id_to_layer_map>
+struct result<layer_map>
load_layer_ids(char const *filename) {
DB("loading IDs from " << filename);
- json jids;
- std::ifstream i(filename);
- i >> jids;
+ auto j = file_to_json(filename);
+ if (j.is_err()) {
+ return Err<layer_map>(j.unwrap_err());
+ }
+ json jids = j.unwrap();
- return to_surface_id_to_layer_map(jids);
+ return to_layer_map(jids);
}
} // namespace
display{d},
controller{},
outputs(),
- layouts(), //load_layout("../layout.json").unwrap()),
- surface2layer(load_layer_ids("../ids.json").unwrap()) {
- // layouts(load_layout("../layout.json").unwrap()) {
+ layouts(),
+ layers() {
assert(g_app == nullptr);
g_app = this;
- try {
+ {
+ auto l = load_layer_ids("../ids.json");
+ if (l.is_ok()) {
+ this->layers = l.unwrap();
+ } else {
+ logerror("%s", l.err().value());
+ }
+ }
+
+ {
auto l = load_layout("../layout.json");
- if (l.is_err()) {
- logerror("Coult not load layout configuration: %s", l.err().value());
+ if (l.is_ok()) {
+ this->layouts = l.unwrap();
+ } else {
+ logerror("%s", l.err().value());
}
- } catch (std::exception &e) {
- logerror("Coult not load layout configuration: %s", e.what());
}
}
return -1;
}
+ if (this->layers.mapping.empty()) {
+ logerror("No surface -> layer mapping loaded");
+ return -1;
+ }
+
this->display->add_global_handler(
"wl_output", [this](wl_registry *r, uint32_t name, uint32_t v) {
this->outputs.emplace_back(std::make_unique<wl::output>(r, name, v));
// 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) {
+ for (auto const &i : this->layers.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);
}
// Add layers to screen (XXX: are they sorted correctly?)
- s->set_render_order(this->surface2layer.layers);
+ s->set_render_order(this->layers.layers);
c->commit_changes();
// |_|
void App::surface_created(uint32_t surface_id) {
DB("surface_id is " << surface_id);
- int layer_id =
- this->surface2layer.get_layer_for_surface(surface_id).value_or(-1);
+ 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->surface2layer.get_rect_for_surface(surface_id).value();
+ auto rect = this->layers.get_layer_rect(surface_id).value();
this->controller->add_task(
"fullscreen surface",
[layer_id, surface_id, rect](struct genivi::controller *c) {
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);
+ 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);
+ logdebug("Surface %u now on layer %u", surface_id, layer_id);
});
}
}
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
+ raise(SIGKILL); // XXX afb-daemon kills it's pgroup using TERM, which
+ // doesn't play well with perf
return Ok(json_object_new_object());
}