From 353bfe55c134bb19247bf26c2498c0d87f80dc18 Mon Sep 17 00:00:00 2001 From: Marcus Fritzsch Date: Tue, 25 Jul 2017 12:27:54 +0200 Subject: [PATCH] app: add very c++-y layout parsing Signed-off-by: Marcus Fritzsch --- src/app.cpp | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- src/app.hpp | 3 +++ src/layout.cpp | 11 ++++++++ src/layout.hpp | 37 +++++++++++++++++++++++++++ 4 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 src/layout.cpp create mode 100644 src/layout.hpp 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 +#include + #include #include +#include +#include + 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 +result get(json const &j) { + T r; + std::istringstream s(j.get()); + s >> r; + return s.fail() ? Err("Could not read int") : Ok(r); +} + +struct wm::area area_from_json(json const &j) { + return wm::area{ + j["name"].get(), + { + get(j["width"]).unwrap(), + get(j["height"]).unwrap(), + get(j["x"]).unwrap(), + get(j["y"]).unwrap(), + }, + get(j["zorder"]).unwrap(), + }; +} + +struct layout layout_from_json(json const &j) { + auto &ja = j["areas"]; + + auto l = wm::layout{j["name"].get(), 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 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 controller; std::vector> 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 +#include + +#include + +#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 layouts_type; + +} // namespace wm + +#endif // TMCAGLWM_LAYOUT_HPP -- 2.16.6