From 7d1bce363c39ac0463caa90498473059110fe91b Mon Sep 17 00:00:00 2001 From: Kazumasa Mitsunari Date: Mon, 23 Oct 2017 15:28:32 +0900 Subject: Change parameter from char* to json_object For future extensibility, change the argument parameter to json_object Bug-AGL: SPEC-990 Conflicts: src/libwindowmanager.cpp Change-Id: I7015fe26d22489f250b67907870d2863d1e8158b Signed-off-by: Kazumasa Mitsunari --- src/libwindowmanager.cpp | 105 ++++++++++++++++++++++++++++------------------- src/libwindowmanager.h | 22 +++++++--- 2 files changed, 80 insertions(+), 47 deletions(-) diff --git a/src/libwindowmanager.cpp b/src/libwindowmanager.cpp index 263dd57..770d248 100644 --- a/src/libwindowmanager.cpp +++ b/src/libwindowmanager.cpp @@ -33,7 +33,6 @@ #include -#include #include extern "C" { @@ -49,14 +48,23 @@ extern "C" { class LibWindowmanager::Impl { friend class LibWindowmanager; + const std::vector kListEventName{ + std::string("active"), + std::string("inactive"), + std::string("visible"), + std::string("invisible"), + std::string("syncdraw"), + std::string("flushdraw") + }; + // This is the LibWindowmanager interface impl int init(int port, char const *token); // WM API - int requestSurface(const char *label); - int activateSurface(const char *label); - int deactivateSurface(const char *label); - int endDraw(const char *label); + int requestSurface(json_object *object); + int activateSurface(json_object *object); + int deactivateSurface(json_object *object); + int endDraw(json_object *object); void set_event_handler(enum EventType et, handler_fun func); @@ -74,7 +82,7 @@ class LibWindowmanager::Impl { const std::function &onReply); public: - void event(char const *et, char const *label); + void event(char const *et, json_object *object); private: int runEventLoop(); }; @@ -127,8 +135,7 @@ void onEvent(void *closure, const char *event, afb_wsj1_msg *msg) { } reinterpret_cast(closure)->event( - event, json_object_get_string( - json_object_object_get(afb_wsj1_msg_object_j(msg), "data"))); + event, json_object_object_get(afb_wsj1_msg_object_j(msg), "data")); } /* called when wsj1 hangsup */ @@ -218,20 +225,29 @@ fail: return rc; } -int LibWindowmanager::Impl::requestSurface(const char *label) { +int LibWindowmanager::Impl::requestSurface(json_object *object) { TRACE(); + const char *tmp_label = json_object_get_string( + json_object_object_get(object, LibWindowmanager::kKeyDrawingName)); + + // DrawingName in "object" is overwrited in api_call("RequestSurface") + // So it is neccesary to copy it. + const char *label = std::string(tmp_label).c_str(); + if (this->labels.find(label) != this->labels.end()) { fputs("Surface label already known!\n", stderr); return -EINVAL; } - json_object *j = drawing_name_json_argument(label); + // Store application name first + // because it may not return from setenv + this->labels.insert(this->labels.end(), label); int rc = -1; /* send the request */ int rc2 = - this->api_call("RequestSurface", j, [&rc](bool ok, json_object *j) { + this->api_call("RequestSurface", object, [&rc](bool ok, json_object *j) { if (ok) { int id = json_object_get_int(json_object_object_get(j, "response")); @@ -257,17 +273,16 @@ int LibWindowmanager::Impl::requestSurface(const char *label) { rc = rc2; } - if (rc >= 0) { - this->labels.insert(this->labels.end(), label); + if (rc < 0) { + this->labels.erase(label); } return rc; } -int LibWindowmanager::Impl::activateSurface(const char *label) { +int LibWindowmanager::Impl::activateSurface(json_object *object) { TRACE(); - json_object *j = drawing_name_json_argument(label); - return this->api_call("ActivateSurface", j, [](bool ok, json_object *j) { + return this->api_call("ActivateSurface", object, [](bool ok, json_object *j) { if (!ok) { fprintf(stderr, "API Call activate_surface() failed: %s\n", j != nullptr ? json_object_to_json_string_ext( @@ -277,10 +292,9 @@ int LibWindowmanager::Impl::activateSurface(const char *label) { }); } -int LibWindowmanager::Impl::deactivateSurface(const char *label) { +int LibWindowmanager::Impl::deactivateSurface(json_object *object) { TRACE(); - json_object *j = drawing_name_json_argument(label); - return this->api_call("DeactivateSurface", j, [](bool ok, json_object *j) { + return this->api_call("DeactivateSurface", object, [](bool ok, json_object *j) { if (!ok) { fprintf(stderr, "API Call deactivate_surface() failed: %s\n", j != nullptr ? json_object_to_json_string_ext( @@ -290,10 +304,9 @@ int LibWindowmanager::Impl::deactivateSurface(const char *label) { }); } -int LibWindowmanager::Impl::endDraw(const char *label) { +int LibWindowmanager::Impl::endDraw(json_object *object) { TRACE(); - json_object *j = drawing_name_json_argument(label); - return this->api_call("EndDraw", j, [](bool ok, json_object *j) { + return this->api_call("EndDraw", object, [](bool ok, json_object *j) { if (!ok) { fprintf(stderr, "API Call endDraw() failed: %s\n", j != nullptr ? json_object_to_json_string_ext( @@ -303,11 +316,21 @@ int LibWindowmanager::Impl::endDraw(const char *label) { }); } -void LibWindowmanager::Impl::set_event_handler( - enum EventType et, std::function func) { +static void _on_reply_static(void *closure, struct afb_wsj1_msg *msg) +{ + fprintf(stderr, "Call %s\n", __func__); +} + +void LibWindowmanager::Impl::set_event_handler(enum EventType et, handler_fun func) { TRACE(); + // Subscribe event + struct json_object* j = json_object_new_object(); + json_object_object_add(j, "event", json_object_new_int(et)); - if (et >= 1 && et <= 6) { // Yeah ... just go with it! + int ret = afb_wsj1_call_j(this->wsj1, wmAPI, "wm_subscribe", j, _on_reply_static, this); + + // Set event handler + if (et >= Event_Active && et <= Event_FlushDraw) { this->handlers[et] = std::move(func); } } @@ -341,12 +364,6 @@ std::pair make_event_type(char const *et) { } } // namespace -static void _on_reply_static(void *closure, struct afb_wsj1_msg *msg) -{ - fprintf(stderr, "Call %s\n", __func__); -} - - /// object will be json_object_put int LibWindowmanager::Impl::api_call( const char *verb, json_object *object, @@ -416,7 +433,7 @@ int LibWindowmanager::Impl::api_call( return rc; } -void LibWindowmanager::Impl::event(char const *et, char const *label) { +void LibWindowmanager::Impl::event(char const *et, json_object *object) { TRACE(); auto oet = make_event_type(et); if (!oet.first) { @@ -426,8 +443,11 @@ void LibWindowmanager::Impl::event(char const *et, char const *label) { auto i = this->handlers.find(oet.second); if (i != this->handlers.end()) { + const char *label = json_object_get_string( + json_object_object_get(object, LibWindowmanager::kKeyDrawingName)); + if (this->labels.find(label) != this->labels.end()) { - i->second(label); + i->second(object); } } } @@ -465,22 +485,23 @@ int LibWindowmanager::init(int port, char const *token) { return this->d->init(port, token); } -int LibWindowmanager::requestSurface(const char *label) { - return this->d->requestSurface(label); +int LibWindowmanager::requestSurface(json_object *object) { + return this->d->requestSurface(object); } -int LibWindowmanager::activateSurface(const char *label) { - return this->d->activateSurface(label); +int LibWindowmanager::activateSurface(json_object *object) { + return this->d->activateSurface(object); } -int LibWindowmanager::deactivateSurface(const char *label) { - return this->d->deactivateSurface(label); +int LibWindowmanager::deactivateSurface(json_object *object) { + return this->d->deactivateSurface(object); } -int LibWindowmanager::endDraw(const char *label) { return this->d->endDraw(label); } +int LibWindowmanager::endDraw(json_object *object) { + return this->d->endDraw(object); +} -void LibWindowmanager::set_event_handler(enum EventType et, - std::function f) { +void LibWindowmanager::set_event_handler(enum EventType et, handler_fun f) { return this->d->set_event_handler(et, std::move(f)); } diff --git a/src/libwindowmanager.h b/src/libwindowmanager.h index 6c13763..5bc97de 100644 --- a/src/libwindowmanager.h +++ b/src/libwindowmanager.h @@ -18,6 +18,7 @@ #define LIBWINDOWMANAGER_H #include +#include class LibWindowmanager { public: @@ -27,7 +28,18 @@ public: LibWindowmanager(const LibWindowmanager &) = delete; LibWindowmanager &operator=(const LibWindowmanager &) = delete; - using handler_fun = std::function; + using handler_fun = std::function; + + /* DrawingArea name (usage: {layout}.{area}) */ + const std::string kStrLayoutNormal = "normal"; + const std::string kStrLayoutSplit = "split"; + const std::string kStrAreaFull = "full"; + const std::string kStrAreaMain = "main"; + const std::string kStrAreaSub = "sub"; + + /* Key for json obejct */ + constexpr static char *kKeyDrawingName = "drawing_name"; + constexpr static char *kKeyDrawingArea = "drawing_area"; enum EventType { Event_Active = 1, @@ -43,10 +55,10 @@ public: int init(int port, char const *token); // WM API - int requestSurface(const char *label); - int activateSurface(const char *label); - int deactivateSurface(const char *label); - int endDraw(const char *label); + int requestSurface(json_object *object); + int activateSurface(json_object *object); + int deactivateSurface(json_object *object); + int endDraw(json_object *object); void set_event_handler(enum EventType et, handler_fun f); -- cgit 1.2.3-korg