jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=63725d71fda340986345725e2df3fcbaaa573649

commit 63725d71fda340986345725e2df3fcbaaa573649
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Thu Nov 23 13:51:10 2017 +0900

    cxx: Implement proper part support (wrt. refs)
    
    It's VERY hacky, but works as expected: no leak, no extra unref. This is
    a lucky case of simply overriding efl_part() implementation in C++,
    without having to modify the declaration.
---
 src/Makefile_Cxx.am                          |  2 +-
 src/examples/elementary/bg_cxx_example_02.cc |  4 ----
 src/lib/efl/Efl.hh                           |  5 +++++
 src/lib/efl/cxx/efl_part_impl.hh             | 26 ++++++++++++++++++++++++++
 4 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/src/Makefile_Cxx.am b/src/Makefile_Cxx.am
index cf99ea3db3..74ac8f7183 100644
--- a/src/Makefile_Cxx.am
+++ b/src/Makefile_Cxx.am
@@ -34,7 +34,7 @@ CLEANFILES += $(elementary_eolian_cxx_hh) 
$(elementary_eolian_cxx_impl_hh) lib/e
 ### Efl C++
 installed_eflcxxmainheadersdir = $(includedir)/efl-cxx-@VMAJ@/
 nodist_installed_eflcxxmainheaders_DATA = $(efl_eolian_cxx_hh) 
$(efl_eolian_cxx_impl_hh) lib/efl/Efl.eo.hh
-dist_installed_eflcxxmainheaders_DATA = lib/efl/Efl.hh
+dist_installed_eflcxxmainheaders_DATA = lib/efl/Efl.hh 
lib/efl/cxx/efl_part_impl.hh
 
 lib/efl/Efl.eo.hh: $(efl_eolian_files) $(_EOLIAN_CXX_DEP)
        $(AM_V_EOLCXX) \
diff --git a/src/examples/elementary/bg_cxx_example_02.cc 
b/src/examples/elementary/bg_cxx_example_02.cc
index 8ef33a8816..eb71693242 100644
--- a/src/examples/elementary/bg_cxx_example_02.cc
+++ b/src/examples/elementary/bg_cxx_example_02.cc
@@ -23,10 +23,6 @@ efl_main(void *data EINA_UNUSED, const Efl_Event *ev 
EINA_UNUSED)
    win.text_set("Bg Image");
    win.autohide_set(true);
 
-   // FIXME: Part API needs some fixing to be nice in C++ :)
-   //efl::eo::downcast<efl::ui::win::Part>(win.part("background"))
-   //      .file_set("performance/background.png", nullptr);
-
    efl::ui::Bg bg(instantiate, win);
    bg.scale_type_set(EFL_UI_IMAGE_SCALE_TYPE_FILL);
    bg.file_set("performance/background.png", nullptr);
diff --git a/src/lib/efl/Efl.hh b/src/lib/efl/Efl.hh
index 20dfc1a90d..a7efc5f8f6 100644
--- a/src/lib/efl/Efl.hh
+++ b/src/lib/efl/Efl.hh
@@ -3,7 +3,12 @@
 
 #ifdef EFL_BETA_API_SUPPORT
 
+#define EFL_PART_IMPL_HH
+#define EFL_OBJECT_BETA
+#define EFL_OBJECT_PROTECTED
+
 #include <Efl.eo.hh>
+#include "cxx/efl_part_impl.hh"
 
 #endif
 #endif
diff --git a/src/lib/efl/cxx/efl_part_impl.hh b/src/lib/efl/cxx/efl_part_impl.hh
new file mode 100644
index 0000000000..c1c99e785a
--- /dev/null
+++ b/src/lib/efl/cxx/efl_part_impl.hh
@@ -0,0 +1,26 @@
+//#ifndef EFL_PART_IMPL_HH
+//#define EFL_PART_IMPL_HH
+
+namespace efl {
+inline ::efl::eolian::return_traits< ::efl::Object>::type Part::part( 
::efl::eolian::in_traits< ::efl::eina::string_view>::type name) const
+{
+   Eo *handle = ::efl_part(this->_eo_ptr(), name.c_str());
+   ::efl_auto_unref_set(handle, false);
+   return ::efl::Object{handle};
+}
+}
+
+namespace eo_cxx {
+namespace efl { 
+inline ::efl::eolian::return_traits< ::efl::Object>::type Part::part( 
::efl::eolian::in_traits< ::efl::eina::string_view>::type name) const
+{
+   Eo *handle = ::efl_part(this->_eo_ptr(), name.c_str());
+   ::efl_auto_unref_set(handle, false);
+   return ::efl::Object{handle};
+}
+inline efl::Part::operator ::efl::Part() const { return *static_cast< 
::efl::Part const*>(static_cast<void const*>(this)); }
+inline efl::Part::operator ::efl::Part&() { return *static_cast< 
::efl::Part*>(static_cast<void*>(this)); }
+inline efl::Part::operator ::efl::Part const&() const { return *static_cast< 
::efl::Part const*>(static_cast<void const*>(this)); }
+} }
+
+//#endif

-- 


Reply via email to