diff options
author | Marcus Fritzsch <marcus_fritzsch@mentor.com> | 2017-07-25 12:27:54 +0200 |
---|---|---|
committer | Marcus Fritzsch <marcus_fritzsch@mentor.com> | 2017-08-08 17:24:00 +0200 |
commit | 353bfe55c134bb19247bf26c2498c0d87f80dc18 (patch) | |
tree | ff1cb65492d0fe3f523fefe21b1fb86fd14e6567 /src | |
parent | f0e3d51ee7adb54cd31f0625a71c86995cf0760f (diff) |
app: add very c++-y layout parsing
Signed-off-by: Marcus Fritzsch <marcus_fritzsch@mentor.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/app.cpp | 80 | ||||
-rw-r--r-- | src/app.hpp | 3 | ||||
-rw-r--r-- | src/layout.cpp | 11 | ||||
-rw-r--r-- | src/layout.hpp | 37 |
4 files changed, 127 insertions, 4 deletions
diff --git a/src/app.cpp b/src/app.cpp index ed17107..ee3a600 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -4,27 +4,99 @@ #include "app.hpp" #include "json_helper.hpp" +#include "layout.hpp" #include "util.hpp" #include "wayland.hpp" +#include <cstdio> +#include <memory> + #include <cassert> #include <json-c/json.h> +#include <fstream> +#include <json.hpp> + namespace wm { +#ifndef NDEBUG +#define DB(expr) \ + std::cerr << __FILE__ << ":" << __LINE__ << ":" << __func__ << ": " << expr \ + << "\n" +#else +#define DB(expr) +#endif + namespace { App *g_app; + +using json = nlohmann::json; + +// We ned to manually unwrap numbers +template <typename T> +result<T> get(json const &j) { + T r; + std::istringstream s(j.get<std::string>()); + s >> r; + return s.fail() ? Err<T>("Could not read int") : Ok(r); +} + +struct wm::area area_from_json(json const &j) { + return wm::area{ + j["name"].get<std::string>(), + { + get<uint32_t>(j["width"]).unwrap(), + get<uint32_t>(j["height"]).unwrap(), + get<int32_t>(j["x"]).unwrap(), + get<int32_t>(j["y"]).unwrap(), + }, + get<uint32_t>(j["zorder"]).unwrap(), + }; +} + +struct layout layout_from_json(json const &j) { + auto &ja = j["areas"]; + + auto l = wm::layout{j["name"].get<std::string>(), uint32_t(ja.size()), {}}; + + logdebug("Loading layout '%s' with %u areas", l.name.c_str(), + unsigned(ja.size())); + + std::transform(std::cbegin(ja), std::cend(ja), std::begin(l.areas), + area_from_json); + + return l; +} + +struct result<layouts_type> load_layout(char const *filename) { + json jlayouts; + std::ifstream i(filename); + i >> jlayouts; + + size_t nlayouts = jlayouts.size(); + auto layouts = layouts_type(nlayouts); + + std::transform(std::cbegin(jlayouts), std::cend(jlayouts), + std::begin(layouts), layout_from_json); + + return Ok(layouts); +} + } // namespace -App::App(wl::display *d) : api{this}, display{d}, controller{}, outputs() { +App::App(wl::display *d) + : api{this}, + display{d}, + controller{}, + outputs(), + layouts() { + // layouts(load_layout("../layout.json").unwrap()) { assert(g_app == nullptr); g_app = this; } -App::~App() { - g_app = nullptr; -} +App::~App() { g_app = nullptr; } int App::init() { if (!this->display->ok()) { diff --git a/src/app.hpp b/src/app.hpp index 172e688..82acfda 100644 --- a/src/app.hpp +++ b/src/app.hpp @@ -11,6 +11,7 @@ #include "afb_binding_api.hpp" #include "result.hpp" #include "wayland.hpp" +#include "layout.hpp" namespace wl { struct display; @@ -31,6 +32,8 @@ struct App { std::unique_ptr<struct genivi::controller> controller; std::vector<std::unique_ptr<struct wl::output>> outputs; + layouts_type layouts; + App(wl::display *d); ~App(); diff --git a/src/layout.cpp b/src/layout.cpp new file mode 100644 index 0000000..749b554 --- /dev/null +++ b/src/layout.cpp @@ -0,0 +1,11 @@ +// +// Created by mfritzsc on 6/27/17. +// + +#include "layout.hpp" + +namespace wm { + + + +} // namespace wm
\ No newline at end of file diff --git a/src/layout.hpp b/src/layout.hpp new file mode 100644 index 0000000..4ee14a7 --- /dev/null +++ b/src/layout.hpp @@ -0,0 +1,37 @@ +// +// Created by mfritzsc on 6/27/17. +// + +#ifndef TMCAGLWM_LAYOUT_HPP +#define TMCAGLWM_LAYOUT_HPP + +#include <cstdint> +#include <string> + +#include <json-c/json.h> + +#include "wayland.hpp" + +namespace wm { + +// Areas and layouts are defined to have a name, let's just keep it this way, +// we will not copy them around anyway. +struct area { + std::string name; + genivi::rect rect; + uint32_t layer; // i.e. zorder? +}; + +struct layout { + static constexpr unsigned MAX_N_AREAS = 2; + + std::string name; + uint32_t n_areas; + struct area areas[MAX_N_AREAS]; +}; + +typedef std::vector<struct layout> layouts_type; + +} // namespace wm + +#endif // TMCAGLWM_LAYOUT_HPP |