aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.cpp
diff options
context:
space:
mode:
authorMarcus Fritzsch <marcus_fritzsch@mentor.com>2017-06-07 18:02:36 +0200
committerMarcus Fritzsch <marcus_fritzsch@mentor.com>2017-08-08 17:24:00 +0200
commit11369e6592800fcf03138b109fee3d4c0736f21a (patch)
treed0c04f5d9f5088ab298fdbdba506df132e9224cc /src/main.cpp
parentacfd4316ac0678aa622b116359821246f06aa080 (diff)
cpp, more listeners
Signed-off-by: Marcus Fritzsch <marcus_fritzsch@mentor.com>
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644
index 0000000..794d9af
--- /dev/null
+++ b/src/main.cpp
@@ -0,0 +1,172 @@
+#include "util.h"
+
+#include "ivi-controller-client-protocol.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <wayland-client.h>
+
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+struct ivi_surface;
+struct ivi_layer;
+
+struct conn {
+ wl_display *d;
+ wl_registry *r;
+ ivi_controller *c;
+ std::vector<std::unique_ptr<wl_output, void (*)(wl_output *)>> outputs;
+ std::map<uint32_t, std::unique_ptr<ivi_layer>> layers;
+ std::map<uint32_t, std::unique_ptr<ivi_surface>> surfaces;
+
+ ~conn();
+};
+
+struct ivi_surface {
+ ivi_controller_surface *controller;
+ uint32_t id;
+ conn *con;
+ ivi_surface(ivi_controller_surface *c, uint32_t i, conn *co)
+ : controller(c), id(i), con(co) {}
+ ~ivi_surface() { ivi_controller_surface_destroy(this->controller, 1); }
+};
+
+struct ivi_layer {
+ ivi_controller_layer *controller;
+ uint32_t id;
+ conn *con;
+ ivi_layer(ivi_controller_layer *c, uint32_t i, conn *co)
+ : controller(c), id(i), con(co) {}
+ ~ivi_layer() { ivi_controller_layer_destroy(this->controller, 1); }
+};
+
+conn::~conn() {
+ this->layers.clear();
+ this->surfaces.clear();
+ ivi_controller_destroy(this->c);
+ this->outputs.clear();
+ wl_registry_destroy(this->r);
+ wl_display_disconnect(this->d);
+}
+
+static ivi_controller_surface_listener cs_listener = {};
+
+static ivi_controller_layer_listener cl_listener = {};
+
+static void c_screen(void *data, struct ivi_controller *ivi_controller,
+ uint32_t id_screen, struct ivi_controller_screen *screen) {
+ lognotice("ivi_controller @ %p screen %u (%x) @ %p", ivi_controller,
+ id_screen, id_screen, screen);
+}
+
+static void c_layer(void *data, struct ivi_controller *ivi_controller,
+ uint32_t id_layer) {
+ lognotice("ivi_controller @ %p layer %u (%x)", ivi_controller, id_layer,
+ id_layer);
+ auto c = static_cast<conn *>(data);
+ auto i = std::make_unique<ivi_layer>(
+ ivi_controller_layer_create(c->c, id_layer, 0, 0), id_layer, c);
+ ivi_controller_layer_add_listener(i->controller, &cl_listener, i.get());
+ c->layers[id_layer] = std::move(i);
+}
+
+static void c_surface(void *data, struct ivi_controller *ivi_controller,
+ uint32_t id_surface) {
+ lognotice("ivi_controller @ %p surface %u (%x)", ivi_controller, id_surface,
+ id_surface);
+ auto c = static_cast<conn *>(data);
+ auto i = std::make_unique<ivi_surface>(
+ ivi_controller_surface_create(c->c, id_surface), id_surface, c);
+ ivi_controller_surface_add_listener(i->controller, &cs_listener, i.get());
+ c->surfaces[id_surface] = std::move(i);
+}
+
+static void c_error(void *data, struct ivi_controller *ivi_controller,
+ int32_t object_id, int32_t object_type, int32_t error_code,
+ const char *error_text) {
+ lognotice("ivi_controller @ %p error o %i t %i c %i text %s", ivi_controller,
+ object_id, object_type, error_code, error_text);
+}
+
+static struct ivi_controller_listener c_listener = {c_screen, c_layer,
+ c_surface, c_error};
+
+static void o_geometry(void *data, struct wl_output *wl_output, int32_t x,
+ int32_t y, int32_t physical_width,
+ int32_t physical_height, int32_t subpixel,
+ const char *make, const char *model, int32_t transform) {
+ lognotice("output @ %p x %i y %i w %i h %i spel %x make %s model %s tx %i",
+ wl_output, x, y, physical_width, physical_height, subpixel, make,
+ model, transform);
+}
+
+static void o_mode(void *data, struct wl_output *wl_output, uint32_t flags,
+ int32_t width, int32_t height, int32_t refresh) {
+ lognotice("output @ %p mode f %x w %i h %i r %i", wl_output, flags, width,
+ height, refresh);
+}
+
+static void o_done(void *data, struct wl_output *wl_output) {
+ lognotice("output @ %p done");
+}
+
+static void o_scale(void *data, struct wl_output *wl_output, int32_t factor) {
+ lognotice("output @ %p scale %i", wl_output, factor);
+}
+
+static struct wl_output_listener o_listener = {o_geometry, o_mode, o_done,
+ o_scale};
+
+static void r_global(void *data, struct wl_registry *r, uint32_t name,
+ char const *iface, uint32_t v) {
+ struct conn *c = static_cast<conn *>(data);
+
+ if (strcmp(iface, "ivi_controller") == 0) {
+ c->c = static_cast<ivi_controller *>(
+ wl_registry_bind(r, name, &ivi_controller_interface, v));
+ ivi_controller_add_listener(c->c, &c_listener, c);
+ } else if (strcmp(iface, "wl_output") == 0) {
+ auto o = static_cast<wl_output *>(
+ wl_registry_bind(r, name, &wl_output_interface, v));
+ c->outputs.emplace_back(std::unique_ptr<wl_output, void (*)(wl_output *)>(
+ o, wl_output_destroy));
+ wl_output_add_listener(o, &o_listener, c);
+ } else {
+ lognotice("registry @ %p global n %u i %s v %u", r, name, iface, v);
+ }
+}
+
+static void r_global_remove(void *data, struct wl_registry *r, uint32_t name) {}
+
+static struct wl_registry_listener r_listener = {r_global, r_global_remove};
+
+int main(int argc, char **argv) {
+ lognotice("WinMan ver. %s", WINMAN_VERSION_STRING);
+
+ if (!getenv("XDG_RUNTIME_DIR"))
+ fatal("Environment variable XDG_RUNTIME_DIR not set");
+
+ struct conn c = {};
+
+ c.d = wl_display_connect(NULL);
+ if (!c.d)
+ fatal("Could not connect to compositor");
+ c.r = wl_display_get_registry(c.d);
+ wl_registry_add_listener(c.r, &r_listener, &c);
+
+ // First level objects
+ wl_display_roundtrip(c.d);
+ // Second level objects
+ wl_display_roundtrip(c.d);
+
+ if (!c.c)
+ fatal("ivi_controller global not available");
+
+ // main loop
+
+ return 0;
+}