From: Marcus Fritzsch Date: Thu, 27 Jul 2017 13:51:35 +0000 (+0200) Subject: layout: add surface id to layer mapping X-Git-Tag: 4.99.1~231 X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=commitdiff_plain;h=bc55aaf18c56a82ee3d12b8ba2a6d7f452dbda2c;p=staging%2Fwindowmanager.git layout: add surface id to layer mapping Signed-off-by: Marcus Fritzsch --- diff --git a/src/layout.cpp b/src/layout.cpp index 749b554..6a77cda 100644 --- a/src/layout.cpp +++ b/src/layout.cpp @@ -2,10 +2,46 @@ // Created by mfritzsc on 6/27/17. // +#include "json_helper.hpp" #include "layout.hpp" namespace wm { +surface_id_to_layer::surface_id_to_layer(nlohmann::json const &j) { + DB(j); + if (j["type"] == "range") { + this->id_min = get(j["first_surface_id"]); + this->id_max = get(j["last_surface_id"]); + } else { + this->id_min = this->id_max = get(j["surface_id"]); + } + this->name = j["name"].get(); + this->layer_id = get(j["layer_id"]); +} +struct result to_surface_id_to_layer_map( + nlohmann::json const &j) { + DB(j); + try { + surface_id_to_layer_map stl{}; + std::transform( + std::cbegin(j), std::cend(j), + std::inserter(stl.mapping, stl.mapping.end()), + [](nlohmann::json const &j) { return surface_id_to_layer(j); }); + for (auto i : stl.mapping) { + if (i.name.empty()) { + return Err( + "Found mapping w/o name"); + } + if (i.layer_id == -1 || i.id_min == -1 || i.id_max == -1) { + return Err( + "Found invalid/unset IDs in mapping"); + } + } + return Ok(stl); + } catch (std::exception &e) { + return Err(e.what()); + } +} } // namespace wm \ No newline at end of file diff --git a/src/layout.hpp b/src/layout.hpp index 4ee14a7..6c60bde 100644 --- a/src/layout.hpp +++ b/src/layout.hpp @@ -6,10 +6,13 @@ #define TMCAGLWM_LAYOUT_HPP #include +#include +#include #include -#include +#include +#include "result.hpp" #include "wayland.hpp" namespace wm { @@ -19,7 +22,7 @@ namespace wm { struct area { std::string name; genivi::rect rect; - uint32_t layer; // i.e. zorder? + uint32_t layer; // i.e. zorder? }; struct layout { @@ -32,6 +35,43 @@ struct layout { typedef std::vector layouts_type; +struct surface_id_to_layer { + int id_min = -1; + int id_max = -1; + std::string name = ""; + int layer_id = -1; + + explicit surface_id_to_layer(nlohmann::json const &j); + + bool operator<(struct surface_id_to_layer const &rhs) const { + return this->id_max < rhs.id_max; + } +}; + +inline bool operator<(struct surface_id_to_layer const &a, int b) { + return a.id_max < b; +} + +struct surface_id_to_layer_map { + typedef std::set map_type; + + map_type mapping; + + std::experimental::optional get_layer_for_surface(int surface_id) { + auto i = std::lower_bound(std::cbegin(this->mapping), + std::cend(this->mapping), surface_id); + + if (i != this->mapping.end()) { + return std::experimental::optional(i->layer_id); + } + + return std::experimental::nullopt; + } +}; + +struct result to_surface_id_to_layer_map( + nlohmann::json const &j); + } // namespace wm #endif // TMCAGLWM_LAYOUT_HPP