kuuko pushed a commit to branch master. http://git.enlightenment.org/bindings/python/python-efl.git/commit/?id=e557b2fcb48eab7effe2fb29e8dd7d17d1a4e534
commit e557b2fcb48eab7effe2fb29e8dd7d17d1a4e534 Author: Kai Huuhko <kai.huu...@gmail.com> Date: Sat Nov 9 07:46:02 2013 +0200 Eo: Add several methods, tests and more debug logging. Methods: - parent_set/get - event_freeze(_get)/thaw - delete Functions: - event_global_freeze(_get)/thaw Moved enums to efl.eo.enums.pxd --- efl/eo/efl.eo.pyx | 119 +++++++++++++++++++++++++++++++++------------ include/efl.c_eo.pxd | 32 +++++++++--- include/efl.eo.enums.pxd | 37 ++++++++++++++ include/efl.eo.pxd | 1 - tests/eo/test_01_basics.py | 52 ++++++++++++++++++++ 5 files changed, 202 insertions(+), 39 deletions(-) diff --git a/efl/eo/efl.eo.pyx b/efl/eo/efl.eo.pyx index b0d40fe..6294388 100644 --- a/efl/eo/efl.eo.pyx +++ b/efl/eo/efl.eo.pyx @@ -25,28 +25,53 @@ from efl.c_eo cimport Eo as cEo, eo_init, eo_shutdown, eo_del, eo_do, \ eo_class_name_get, eo_class_get, eo_base_data_set, eo_base_data_get, \ eo_base_data_del, eo_event_callback_add, eo_event_callback_del, \ Eo_Event_Description, const_Eo_Event_Description, \ - eo_parent_get, EO_EV_DEL + eo_parent_get, EO_EV_DEL, EO_BASE_BASE_ID, eo_base_class_get, \ + eo_event_freeze, eo_event_thaw, eo_event_freeze_get, \ + eo_event_global_freeze, eo_event_global_thaw, eo_event_global_freeze_get, \ + const_Eo, eo_parent_set + +cimport efl.eo.enums as enums from efl.utils.logger cimport add_logger # Set this to public and export it in pxd if you need it in another module cdef int PY_EFL_EO_LOG_DOMAIN = add_logger(__name__).eina_log_domain +cdef int PY_REFCOUNT(object o): + cdef PyObject *obj = <PyObject *>o + return obj.ob_refcnt + +###################################################################### def init(): EINA_LOG_DOM_INFO(PY_EFL_EO_LOG_DOMAIN, "Initializing efl.eo", NULL) return eo_init() def shutdown(): + EINA_LOG_DOM_INFO(PY_EFL_EO_LOG_DOMAIN, "Shutting down efl.eo", NULL) return eo_shutdown() init() - -cdef int PY_REFCOUNT(object o): - cdef PyObject *obj = <PyObject *>o - return obj.ob_refcnt - +def event_global_freeze_get(): + cdef int fcount + eo_do( + <const_Eo *>eo_base_class_get(), + eo_event_global_freeze_get(&fcount), + ) + return fcount + +def event_global_freeze(): + eo_do( + <const_Eo *>eo_base_class_get(), + eo_event_global_freeze(), + ) + +def event_global_thaw(): + eo_do( + <const_Eo *>eo_base_class_get(), + eo_event_global_thaw() + ) ###################################################################### @@ -68,7 +93,8 @@ cdef void _object_mapping_register(char *name, object cls) except *: cdef object cls_name = cls.__name__ if isinstance(cls_name, unicode): cls_name = PyUnicode_AsUTF8String(cls_name) - EINA_LOG_DOM_DBG(PY_EFL_EO_LOG_DOMAIN, "REGISTER: %s => %s", <char *>name, <char *>cls_name) + EINA_LOG_DOM_DBG(PY_EFL_EO_LOG_DOMAIN, + "REGISTER: %s => %s", <char *>name, <char *>cls_name) eina_hash_add(object_mapping, name, <PyObject *>cls) @@ -81,7 +107,7 @@ cdef object object_from_instance(cEo *obj): cdef: void *data Eo o - const_char *cls_name + const_char *cls_name = eo_class_name_get(eo_class_get(obj)) type cls void *cls_ret @@ -90,27 +116,33 @@ cdef object object_from_instance(cEo *obj): eo_do(obj, eo_base_data_get("python-eo", &data)) if data != NULL: - #print("Found: %s" % Eo.__repr__(<Eo>data)) + EINA_LOG_DOM_DBG(PY_EFL_EO_LOG_DOMAIN, + "Returning a Python object instance for Eo of type %s.", cls_name) return <Eo>data - cls_name = eo_class_name_get(eo_class_get(obj)) if cls_name == NULL: - raise ValueError("Eo object at %#x does not have a type!" % <unsigned long>obj) - #print("Class name: %s" % cls_name) + raise ValueError( + "Eo object at %#x does not have a type!" % <unsigned long>obj) cls_ret = eina_hash_find(object_mapping, cls_name) if cls_ret == NULL: - raise ValueError("Eo object at %#x of type %s does not have a mapping!" % - (<unsigned long>obj, cls_name)) + # TODO: Add here a last ditch effort to import the class from a module + raise ValueError( + "Eo object at %#x of type %s does not have a mapping!" % ( + <unsigned long>obj, cls_name) + ) cls = <type>cls_ret if cls is None: - raise ValueError("Mapping for Eo object at %#x, type %s, contains None!" % - (<unsigned long>obj, cls_name)) + raise ValueError( + "Mapping for Eo object at %#x, type %s, contains None!" % ( + <unsigned long>obj, cls_name)) + + EINA_LOG_DOM_DBG(PY_EFL_EO_LOG_DOMAIN, + "Constructing a Python object from Eo of type %s.", cls_name) - #print("MAPPING OBJECT:", cls_name, "=>", cls) o = cls.__new__(cls) o._set_obj(obj) return o @@ -138,28 +170,28 @@ cdef void _register_decorated_callbacks(object obj): ###################################################################### -# TODO: Move these to enums.pxd -cdef: - int C_EO_CALLBACK_STOP = 0 - int C_EO_CALLBACK_CONTINUE = 1 - -EO_CALLBACK_STOP = C_EO_CALLBACK_STOP -EO_CALLBACK_CONTINUE = C_EO_CALLBACK_CONTINUE +EO_CALLBACK_STOP = enums.EO_CALLBACK_STOP +EO_CALLBACK_CONTINUE = enums.EO_CALLBACK_CONTINUE ###################################################################### -cdef Eina_Bool _eo_event_del_cb(void *data, cEo *obj, const_Eo_Event_Description *desc, void *event_info) with gil: - cdef Eo self = <Eo>data +cdef Eina_Bool _eo_event_del_cb(void *data, cEo *obj, + const_Eo_Event_Description *desc, void *event_info) with gil: + cdef: + Eo self = <Eo>data + const_char *cls_name = eo_class_name_get(eo_class_get(obj)) + + EINA_LOG_DOM_DBG(PY_EFL_EO_LOG_DOMAIN, "Deleting Eo: %s", cls_name) -# print("DEL CB: %s" % Eo.__repr__(self)) - eo_do(self.obj, eo_event_callback_del(EO_EV_DEL, _eo_event_del_cb, <const_void *>self)) + eo_do(self.obj, + eo_event_callback_del(EO_EV_DEL, _eo_event_del_cb, <const_void *>self)) eo_do(self.obj, eo_base_data_del("python-eo")) self.obj = NULL Py_DECREF(self) - return C_EO_CALLBACK_STOP + return enums.EO_CALLBACK_STOP cdef class Eo(object): @@ -180,11 +212,14 @@ cdef class Eo(object): raise TypeError("Must not instantiate Eo, but subclasses") def __repr__(self): + cdef cEo *parent = NULL + if self.obj != NULL: + eo_do(self.obj, eo_parent_get(&parent)) return ("<%s object (Eo) at %#x (obj=%#x, parent=%#x, refcount=%d)>") % ( type(self).__name__, <unsigned long><void *>self, <unsigned long>self.obj, - <unsigned long><void *>eo_parent_get(&self.obj) if self.obj != NULL else 0, + <unsigned long>parent, PY_REFCOUNT(self)) def __nonzero__(self): @@ -196,7 +231,8 @@ cdef class Eo(object): self.obj = obj eo_do(self.obj, eo_base_data_set("python-eo", <void *>self, NULL)) - eo_do(self.obj, eo_event_callback_add(EO_EV_DEL, _eo_event_del_cb, <const_void *>self)) + eo_do(self.obj, + eo_event_callback_add(EO_EV_DEL, _eo_event_del_cb, <const_void *>self)) Py_INCREF(self) cdef void _set_properties_from_keyword_args(self, dict kwargs) except *: @@ -205,7 +241,28 @@ cdef class Eo(object): assert k in cls_list, "%s has no attribute with the name %s." % (self, k) setattr(self, k, v) + def delete(self): + eo_del(self.obj) + def is_deleted(self): "Check if the object has been deleted thus leaving the object shallow" return bool(self.obj == NULL) + def parent_set(self, Eo parent): + eo_do(self.obj, eo_parent_set(parent.obj)) + + def parent_get(self): + cdef cEo *parent = NULL + eo_do(self.obj, eo_parent_get(&parent)) + return object_from_instance(parent) + + def event_freeze(self): + eo_do(self.obj, eo_event_freeze()) + + def event_thaw(self): + eo_do(self.obj, eo_event_thaw()) + + def event_freeze_get(self): + cdef int fcount + eo_do(self.obj, eo_event_freeze_get(&fcount)) + return fcount diff --git a/include/efl.c_eo.pxd b/include/efl.c_eo.pxd index 62696e1..cf48e1d 100644 --- a/include/efl.c_eo.pxd +++ b/include/efl.c_eo.pxd @@ -37,6 +37,10 @@ cdef extern from "Eo.h": ctypedef Eo_Event_Description const_Eo_Event_Description "const Eo_Event_Description" + ctypedef unsigned int Eo_Op + + ctypedef Eo_Op EO_BASE_BASE_ID + #################################################################### # Eo Events # @@ -62,18 +66,32 @@ cdef extern from "Eo.h": int eo_ref_get(const_Eo *obj) void eo_del(const_Eo *obj) - void eo_wref_add(Eo *obj) + Eo_Op eo_wref_add(Eo *obj) Eina_Bool eo_do(Eo *obj, ...) - void eo_base_data_set(const_char *key, const_void *data, eo_base_data_free_func free_func) - void eo_base_data_get(const_char *key, void **data) - void eo_base_data_del(const_char *key) + Eina_Bool eo_class_do(Eo_Class *cls, ...) + const_Eo_Class *eo_base_class_get() + + Eo_Op eo_base_data_set(const_char *key, const_void *data, eo_base_data_free_func free_func) + Eo_Op eo_base_data_get(const_char *key, void **data) + Eo_Op eo_base_data_del(const_char *key) const_Eo_Class *eo_class_get(const_Eo *obj) const_char *eo_class_name_get(const_Eo_Class *klass) - Eo *eo_parent_get(Eo **obj) + Eo_Op eo_parent_set(Eo *parent) + Eo_Op eo_parent_get(Eo **parent) + + Eo_Op eo_event_callback_forwarder_add(const_Eo_Event_Description *desc, Eo *new_obj) + Eo_Op eo_event_callback_forwarder_del(const_Eo_Event_Description *desc, Eo *new_obj) + + Eo_Op eo_event_freeze() + Eo_Op eo_event_thaw() + Eo_Op eo_event_freeze_get(int *fcount) - void eo_event_callback_add(const_Eo_Event_Description *desc, Eo_Event_Cb cb, const_void *data) - void eo_event_callback_del(const_Eo_Event_Description *desc, Eo_Event_Cb cb, const_void *data) + Eo_Op eo_event_global_freeze() + Eo_Op eo_event_global_thaw() + Eo_Op eo_event_global_freeze_get(int *fcount) + Eo_Op eo_event_callback_add(const_Eo_Event_Description *desc, Eo_Event_Cb cb, const_void *data) + Eo_Op eo_event_callback_del(const_Eo_Event_Description *desc, Eo_Event_Cb cb, const_void *data) diff --git a/include/efl.eo.enums.pxd b/include/efl.eo.enums.pxd new file mode 100644 index 0000000..2ad0435 --- /dev/null +++ b/include/efl.eo.enums.pxd @@ -0,0 +1,37 @@ + +cdef extern from "Eo.h": + enum: + EO_BASE_SUB_ID_CONSTRUCTOR + EO_BASE_SUB_ID_DESTRUCTOR + EO_BASE_SUB_ID_PARENT_SET + EO_BASE_SUB_ID_PARENT_GET + EO_BASE_SUB_ID_CHILDREN_ITERATOR_NEW + EO_BASE_SUB_ID_DATA_SET + EO_BASE_SUB_ID_DATA_GET + EO_BASE_SUB_ID_DATA_DEL + EO_BASE_SUB_ID_WREF_ADD + EO_BASE_SUB_ID_WREF_DEL + EO_BASE_SUB_ID_EVENT_CALLBACK_PRIORITY_ADD + EO_BASE_SUB_ID_EVENT_CALLBACK_DEL + EO_BASE_SUB_ID_EVENT_CALLBACK_ARRAY_PRIORITY_ADD + EO_BASE_SUB_ID_EVENT_CALLBACK_ARRAY_DEL + EO_BASE_SUB_ID_EVENT_CALLBACK_CALL + EO_BASE_SUB_ID_EVENT_CALLBACK_FORWARDER_ADD + EO_BASE_SUB_ID_EVENT_CALLBACK_FORWARDER_DEL + EO_BASE_SUB_ID_EVENT_FREEZE + EO_BASE_SUB_ID_EVENT_THAW + EO_BASE_SUB_ID_EVENT_FREEZE_GET + EO_BASE_SUB_ID_EVENT_GLOBAL_FREEZE + EO_BASE_SUB_ID_EVENT_GLOBAL_THAW + EO_BASE_SUB_ID_EVENT_GLOBAL_FREEZE_GET + EO_BASE_SUB_ID_DBG_INFO_GET + EO_BASE_SUB_ID_LAST + + enum: + EO_CALLBACK_PRIORITY_BEFORE + EO_CALLBACK_PRIORITY_DEFAULT + EO_CALLBACK_PRIORITY_AFTER + + enum: + EO_CALLBACK_STOP + EO_CALLBACK_CONTINUE diff --git a/include/efl.eo.pxd b/include/efl.eo.pxd index ad3b7e5..4e3274c 100644 --- a/include/efl.eo.pxd +++ b/include/efl.eo.pxd @@ -29,7 +29,6 @@ cdef: void _set_obj(self, cEo *obj) except * void _set_properties_from_keyword_args(self, dict kwargs) except * - #void *_unset_obj(self) #_add_obj(self, Eo_Class *klass, cEo *parent) diff --git a/tests/eo/test_01_basics.py b/tests/eo/test_01_basics.py new file mode 100644 index 0000000..ba8c6bd --- /dev/null +++ b/tests/eo/test_01_basics.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python + +from efl import eo +from efl.eo import Eo + +from efl import elementary +from efl.elementary.window import Window, ELM_WIN_BASIC +from efl.elementary.button import Button + +eo.init() +elementary.init() + +import os, unittest + + +class TestBasics(unittest.TestCase): + + def setUp(self): + self.o = eo.Eo.__new__(eo.Eo) + + def tearDown(self): + self.o.delete() + + def testEoConstructor(self): + self.assertRaises(TypeError, self.o.__init__) + + def testRepr(self): + self.assertIsNotNone(repr(self.o)) + + def testParentGet(self): + self.assertIsNone(self.o.parent_get()) + +class TestElmBasics(unittest.TestCase): + + def setUp(self): + self.o = Window("t", ELM_WIN_BASIC) + + def tearDown(self): + self.o.delete() + + def testParentGet1(self): + self.assertIsNone(self.o.parent_get()) + + def testParentGet2(self): + o = Button(self.o) + self.assertEqual(Eo.parent_get(o), self.o) + o.delete() + +if __name__ == '__main__': + unittest.main(verbosity=2) + elementary.shutdown() + eo.shutdown() --