Allow to pass event_info to callback 01/241201/2
authorBartlomiej Grzelewski <b.grzelewski@samsung.com>
Tue, 18 Aug 2020 11:10:51 +0000 (13:10 +0200)
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>
Tue, 18 Aug 2020 12:17:18 +0000 (14:17 +0200)
In original implmentation callback on c++ level does not have
a way to access event_info parameter. Usually it's not required
as it keeps only event name. Unfortunately in some cases there is
a pointer that must be accessed in lambda callback.

Change-Id: Id391f9b9dd25be554205c20834a4fb7cefd768a6

src/ui/Widget.cpp
src/ui/Widget.hpp
src/utils/WidgetCallback.hpp

index 320be1e5332afcd250b0ffc8b7ce84f99e96e557..e44010d285ad8ff0e7e2d2a487475c4677068fb1 100644 (file)
@@ -79,7 +79,17 @@ void Widget::setEvasSmartCallback(const std::string &eventName, std::function<vo
 {
        auto cbData = std::make_unique<WidgetCallback::Data<Widget, std::string>>(this, eventName);
        auto dataPtr = cbData.get();
-       smartCallbacks_.insert_or_assign(eventName, WidgetCallback::Value<Widget, std::string>{std::move(callback), std::move(cbData)});
+       smartCallbacks_.insert_or_assign(eventName,
+         std::make_unique<WidgetCallback::ValueExVoid<Widget,std::string>>(std::move(callback), std::move(cbData)));
+       evas_object_smart_callback_add(getObject(), eventName.c_str(), smartCallbackMethod, dataPtr);
+}
+
+void Widget::setEvasSmartCallback(const std::string &eventName, std::function<void(void*)> callback)
+{
+       auto cbData = std::make_unique<WidgetCallback::Data<Widget, std::string>>(this, eventName);
+       auto dataPtr = cbData.get();
+       smartCallbacks_.insert_or_assign(eventName,
+         std::make_unique<WidgetCallback::ValueExVoidPtr<Widget, std::string>>(std::move(callback), std::move(cbData)));
        evas_object_smart_callback_add(getObject(), eventName.c_str(), smartCallbackMethod, dataPtr);
 }
 
@@ -196,8 +206,7 @@ void Widget::smartCallbackMethod(void *data, Evas_Object *obj, void *event_info)
                ERROR("No callback registered for this event");
                return;
        }
-       auto c = cb->second.callback;
-       c();
+       cb->second->callback(event_info);
 }
 
 void Widget::eextEventMethod(void *data, Evas_Object *obj, void *event_info)
index a892ab3c264bcdb374805b429806e1470437cb66..7428a5a174ab07fab76fd4bc4009a3e6b416015b 100644 (file)
@@ -55,6 +55,7 @@ class Widget
        Rectangle getGeometry();
        void setPosition(Point anchor);
        void setEvasSmartCallback(const std::string &eventName, std::function<void()> callback);
+       void setEvasSmartCallback(const std::string &eventName, std::function<void(void *)> callback);
        void removeEvasSmartCallback(const std::string &eventName);
        void setEextEventCallback(const Eext_Callback_Type type, std::function<void()> callback);
        void setStyle(const std::string &style);
@@ -84,7 +85,7 @@ class Widget
        std::unique_ptr<Evas_Object, utils::EvasDeleter> uniqueObj_;
        Widget *parent_ = nullptr;
        std::vector<std::unique_ptr<Widget>> children_;
-       std::unordered_map<std::string, WidgetCallback::Value<Widget, std::string>> smartCallbacks_;
+       std::unordered_map<std::string, std::unique_ptr<WidgetCallback::ValueEx<Widget, std::string>>> smartCallbacks_;
        std::unordered_map<Eext_Callback_Type, WidgetCallback::Value<Widget, Eext_Callback_Type>> eextEventCallbacks_;
 };
 
index cc30e0dd76e815e62a25d97964aa4c0253f72a99..069a400d38154d48b56a6a612500f37fd14f1b12 100644 (file)
@@ -42,5 +42,28 @@ namespace WidgetCallback
                std::unique_ptr<Data<S, T>> data;
        };
 
+       template <typename S, typename T>
+       struct ValueEx
+       {
+               ValueEx(std::unique_ptr<Data<S,T>> d) : data(std::move(d)) {}
+               virtual void callback(void *event_info) = 0;
+               std::unique_ptr<Data<S, T>> data;
+               virtual ~ValueEx(){}
+       };
+
+       template <typename S, typename T>
+       struct ValueExVoid : public ValueEx<S,T> {
+               ValueExVoid(std::function<void()> fun, std::unique_ptr<Data<S,T>> ptr) : ValueEx<S,T>(std::move(ptr)), call(std::move(fun)) {}
+               std::function<void()> call;
+               void callback(void *) { call(); }
+       };
+
+       template <typename S, typename T>
+       struct ValueExVoidPtr : public ValueEx<S,T> {
+               ValueExVoidPtr(std::function<void(void*)> fun, std::unique_ptr<Data<S,T>> ptr) : ValueEx<S,T>(std::move(ptr)), call(std::move(fun)) {}
+               std::function<void(void*)> call;
+               void callback(void *event_info) { call(event_info); }
+       };
+
 } // namespace WidgetCallback
 #endif