cpp, more listeners
authorMarcus Fritzsch <marcus_fritzsch@mentor.com>
Wed, 7 Jun 2017 16:02:36 +0000 (18:02 +0200)
committerMarcus Fritzsch <marcus_fritzsch@mentor.com>
Tue, 8 Aug 2017 15:24:00 +0000 (17:24 +0200)
Signed-off-by: Marcus Fritzsch <marcus_fritzsch@mentor.com>
CMakeLists.txt
session.vim
src/CMakeLists.txt
src/main.c [deleted file]
src/main.cpp [new file with mode: 0644]
src/util.h

index 31417c6..791e645 100644 (file)
@@ -43,5 +43,6 @@ endmacro()
 add_definitions(-D_GNU_SOURCE)
 
 set(CMAKE_C_FLAGS "-Wall -Wextra -Wno-unused-parameter -std=c99 ${CMAKE_C_FLAGS}")
+set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-unused-parameter -std=c++14 ${CMAKE_CXX_FLAGS}")
 
 add_subdirectory(src)
index 47dd26f..63ede7e 100644 (file)
@@ -7,16 +7,18 @@ if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == ''
   let s:wipebuf = bufnr('%')
 endif
 set shortmess=aoO
-badd +34 src/main.c
-badd +1 term://.//32710:/usr/bin/fish
-badd +2 src/CMakeLists.txt
-badd +8 CMakeLists.txt
+badd +77 src/main.c
+badd +10 src/CMakeLists.txt
+badd +46 CMakeLists.txt
 badd +19 src/util.c
-badd +8 src/util.h
+badd +14 src/util.h
+badd +1 term://.//9732:/usr/bin/fish
+badd +1 main.cpp
+badd +26 src/main.cpp
 argglobal
 silent! argdel *
 argadd src/main.c
-edit src/main.c
+edit src/main.cpp
 set splitbelow splitright
 wincmd _ | wincmd |
 vsplit
@@ -37,15 +39,15 @@ setlocal fdl=0
 setlocal fml=1
 setlocal fdn=20
 setlocal fen
-let s:l = 54 - ((32 * winheight(0) + 33) / 66)
+let s:l = 125 - ((60 * winheight(0) + 33) / 66)
 if s:l < 1 | let s:l = 1 | endif
 exe s:l
 normal! zt
-54
-normal! 04|
+125
+normal! 022|
 wincmd w
 argglobal
-edit term://.//32710:/usr/bin/fish
+edit term://.//9732:/usr/bin/fish
 setlocal fdm=marker
 setlocal fde=0
 setlocal fmr={{{,}}}
@@ -54,11 +56,11 @@ setlocal fdl=0
 setlocal fml=1
 setlocal fdn=20
 setlocal fen
-let s:l = 14 - ((13 * winheight(0) + 33) / 66)
+let s:l = 41 - ((13 * winheight(0) + 33) / 66)
 if s:l < 1 | let s:l = 1 | endif
 exe s:l
 normal! zt
-14
+41
 normal! 0
 wincmd w
 exe 'vert 1resize ' . ((&columns * 137 + 137) / 274)
index d38a6f6..86e7ecd 100644 (file)
@@ -2,7 +2,7 @@ wlproto(IVI_APP ivi-application)
 wlproto(IVI_CON ivi-controller)
 
 add_executable(winman
-   main.c
+   main.cpp
    util.c
    util.h
    ${IVI_APP_PROTO}
diff --git a/src/main.c b/src/main.c
deleted file mode 100644 (file)
index 7cdef06..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-#include "util.h"
-
-#include "ivi-controller-client-protocol.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <wayland-client.h>
-
-struct conn {
-   struct wl_display *d;
-   struct wl_registry *r;
-   struct wl_array outputs;
-
-   struct ivi_controller *c;
-};
-
-static void c_screen(void *data, struct ivi_controller *ivi_controller,
-              uint32_t id_screen, struct ivi_controller_screen *screen) {}
-
-static void c_layer(void *data, struct ivi_controller *ivi_controller,
-             uint32_t id_layer) {}
-
-static void c_surface(void *data, struct ivi_controller *ivi_controller,
-               uint32_t id_surface) {}
-
-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) {}
-
-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) {}
-
-static void o_mode(void *data, struct wl_output *wl_output, uint32_t flags,
-            int32_t width, int32_t height, int32_t refresh) {}
-
-static void o_done(void *data, struct wl_output *wl_output) {}
-
-static void o_scale(void *data, struct wl_output *wl_output, int32_t factor) {}
-
-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 = data;
-
-   if (strcmp(iface, "ivi_controller") == 0) {
-      c->c = 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) {
-      struct wl_output **o = wl_array_add(&c->outputs, sizeof(*o));
-      *o = wl_registry_bind(r, name, &wl_output_interface, v);
-      wl_output_add_listener(*o, &o_listener, c);
-   }
-}
-
-static void r_global_remove(void *data, struct wl_registry *r, uint32_t name) {}
-
-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;
-   wl_array_init(&c.outputs);
-   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
-   while (wl_display_dispatch(c.d) != -1) {
-   }
-
-   ivi_controller_destroy(c.c);
-   wl_registry_destroy(c.r);
-   wl_display_disconnect(c.d);
-
-   return 0;
-}
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644 (file)
index 0000000..794d9af
--- /dev/null
@@ -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;
+}
index 7a15454..27d1015 100644 (file)
@@ -1,8 +1,16 @@
 #ifndef WM_UTIL_H
 #define WM_UTIL_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 void lognotice(char const *fmt, ...);
 void logerror(char const *fmt, ...);
 void fatal(char const *fmt, ...);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif // !WM_UTIL_H