Enlightenment CVS committal Author : barbieri Project : e17 Module : proto/python-efl
Dir : e17/proto/python-efl/python-evas/evas Modified Files: evas.c_evas.pyx evas.c_evas_canvas.pxi evas.c_evas_object.pxi evas.c_evas_object_callbacks.pxi evas.c_evas_object_smart.pxi Log Message: Cleanup * import traceback just once; * check for callable functions in callback connections; * help garbage collector releasing references ASAP; * fix handling of "free" event callback, make it coherent on both on_free_add() and event_callback_add(); * use just one Canvas instance; * __str__() and __repr__() do not print clip info anymore (it was recursive). =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-evas/evas/evas.c_evas.pyx,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- evas.c_evas.pyx 1 Sep 2007 15:59:30 -0000 1.9 +++ evas.c_evas.pyx 21 Sep 2007 23:56:05 -0000 1.10 @@ -26,6 +26,9 @@ evas_render_method_list_free(lst) return ret +cdef object canvas_mapping + +canvas_mapping = dict() cdef Canvas Canvas_from_instance(Evas *evas): cdef void *data @@ -34,10 +37,29 @@ if evas == NULL: return None - c = Canvas.__new__(Canvas) - c._set_obj(evas) + o = canvas_mapping.get(<long>evas, None) + if o is not None: + c = o + else: + c = Canvas.__new__(Canvas) + c._set_obj(evas) # calls Canvas_remember() return c + +cdef int Canvas_remember(long ptr, Canvas c) except 0: + o = canvas_mapping.get(ptr, None) + if o is not None: + raise ValueError("Canvas 0x%x already registered for %s" % (ptr, o)) + canvas_mapping[ptr] = c + return 1 + + +cdef int Canvas_forget(long ptr) except 0: + try: + del canvas_mapping[ptr] + except KeyError, e: + raise ValueError("Canvas 0x%x is unknown" % ptr) + return 1 # XXX: this should be C-only, but it would require ecore_evas =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-evas/evas/evas.c_evas_canvas.pxi,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- evas.c_evas_canvas.pxi 2 Sep 2007 15:11:54 -0000 1.11 +++ evas.c_evas_canvas.pxi 21 Sep 2007 23:56:05 -0000 1.12 @@ -15,18 +15,21 @@ def __dealloc__(self): if self.obj: + _Canvas_forget(<long>self.obj) evas_free(self.obj) self.obj = NULL cdef int _set_obj(self, Evas *obj) except 0: assert self.obj == NULL, "Object must be clean" self.obj = obj + Canvas_remember(<long>self.obj, self) return 1 # XXX: this should be C-only, but it would require ecore_evas # XXX: being able to use it. def _unset_obj(self): "Remove internally wrapped Evas* object." + Canvas_forget(<long>self.obj) self.obj = NULL def _new_evas(self): =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-evas/evas/evas.c_evas_object.pxi,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- evas.c_evas_object.pxi 13 Sep 2007 23:15:14 -0000 1.13 +++ evas.c_evas_object.pxi 21 Sep 2007 23:56:05 -0000 1.14 @@ -1,20 +1,45 @@ # This file is included verbatim by c_evas.pyx +import traceback + + +cdef int _free_wrapper_resources(Object obj) except 0: + cdef int i + for i from 0 <= i < evas_event_callbacks_len: + obj._callbacks[i] = None + obj._data.clear() + return 1 + + +cdef int _unregister_callbacks(Object obj) except 0: + cdef Evas_Object *o + cdef evas_event_callback_t cb + o = obj.obj + if o != NULL: + for i, lst in enumerate(obj._callbacks): + if lst is not None: + cb = evas_event_callbacks[i] + evas_object_event_callback_del(o, i, cb) + + evas_object_event_callback_del(o, EVAS_CALLBACK_FREE, obj_free_cb) + return 1 + + cdef void obj_free_cb(void *data, Evas *e, Evas_Object *obj, void *event_info): cdef Object self self = <Object>data self.obj = NULL self._evas = <Canvas>None - if self._callbacks[EVAS_CALLBACK_FREE] is not None: - lst = self._callbacks[EVAS_CALLBACK_FREE] + lst = self._callbacks[EVAS_CALLBACK_FREE] + if lst is not None: for func, args, kargs in lst: try: func(self, *args, **kargs) except Exception, e: - import traceback traceback.print_exc() + _free_wrapper_resources(self) python.Py_DECREF(self) @@ -58,7 +83,11 @@ (func, type)) del lst[i] - return len(lst) == 0 + if len(lst) == 0: + obj._callbacks[type] = None + return True + else: + return False cdef public class Object [object PyEvasObject, type PyEvasObject_Type]: @@ -79,29 +108,30 @@ name_str = "name=%r, " else: name_str = "" + clip = bool(self.clip_get() is not None) return ("%s(%sgeometry=(%d, %d, %d, %d), color=(%d, %d, %d, %d), " "layer=%s, clip=%s, visible=%s)") % \ (self.__class__.__name__, name_str, x, y, w, h, - r, g, b, a, self.layer_get(), self.clip_get(), - self.visible_get()) + r, g, b, a, self.layer_get(), clip, self.visible_get()) def __repr__(self): x, y, w, h = self.geometry_get() r, g, b, a = self.color_get() + clip = bool(self.clip_get() is not None) return ("%s(0x%x, type=%r, refcount=%d, Evas_Object=0x%x, name=%r, " "geometry=(%d, %d, %d, %d), color=(%d, %d, %d, %d), " "layer=%s, clip=%r, visible=%s)") % \ (self.__class__.__name__, <unsigned long>self, self.type_get(), PY_REFCOUNT(self), <unsigned long>self.obj, self.name_get(), x, y, w, h, r, g, b, a, self.layer_get(), - self.clip_get(), self.visible_get()) + clip, self.visible_get()) cdef int _unset_obj(self) except 0: assert self.obj != NULL, "Object must wrap something" assert evas_object_data_del(self.obj, "python-evas") == \ <void *>self, "Object wrapped should refer to self" - evas_object_event_callback_del(self.obj, EVAS_CALLBACK_FREE, - obj_free_cb) + _unregister_callbacks(self) + _free_wrapper_resources(self) self.obj = NULL python.Py_DECREF(self) return 1 @@ -122,28 +152,18 @@ def __dealloc__(self): cdef void *data cdef Evas_Object *obj - cdef evas_event_callback_t cb - - #print "==>DEALLOC: type=%s, instance=%s" % (self.type_get(), self) - - if self.obj != NULL: - for i, lst in enumerate(self._callbacks): - if lst is not None: - cb = evas_event_callbacks[i] - evas_object_event_callback_del(self.obj, i, cb) + _unregister_callbacks(self) self._data = None self._callbacks = None obj = self.obj - if self.obj == NULL: + if obj == NULL: return self.obj = NULL - self._evas = <Canvas>None data = evas_object_data_get(obj, "python-evas") assert data == NULL, "Object must not be wrapped!" - evas_object_event_callback_del(obj, EVAS_CALLBACK_FREE, obj_free_cb) evas_object_del(obj) def delete(self): @@ -583,19 +603,24 @@ def event_callback_add(self, int type, func, *args, **kargs): cdef evas_event_callback_t cb + + if not callable(func): + raise TypeError("func must be callable") + if _add_callback_to_list(self, type, func, args, kargs): - cb = evas_event_callbacks[type] - evas_object_event_callback_add(self.obj, - <Evas_Callback_Type>type, - cb, <void*>self) + if type != EVAS_CALLBACK_FREE: + cb = evas_event_callbacks[type] + evas_object_event_callback_add(self.obj, + <Evas_Callback_Type>type, + cb, <void*>self) def event_callback_del(self, int type, func): cdef evas_event_callback_t cb if _del_callback_from_list(self, type, func): - self._callbacks[type] = None - cb = evas_event_callbacks[type] - evas_object_event_callback_del(self.obj, - <Evas_Callback_Type>type, cb) + if type != EVAS_CALLBACK_FREE: + cb = evas_event_callbacks[type] + evas_object_event_callback_del(self.obj, + <Evas_Callback_Type>type, cb) def on_mouse_in_add(self, func, *a, **k): self.event_callback_add(EVAS_CALLBACK_MOUSE_IN, func, *a, **k) @@ -634,10 +659,10 @@ self.event_callback_del(EVAS_CALLBACK_MOUSE_WHEEL, func) def on_free_add(self, func, *a, **k): - _add_callback_to_list(self, EVAS_CALLBACK_FREE, func, a, k) + self.event_callback_add(EVAS_CALLBACK_FREE, func, *a, **k) def on_free_del(self, func): - _del_callback_from_list(self, EVAS_CALLBACK_FREE, func) + self.event_callback_del(EVAS_CALLBACK_FREE, func) def on_key_down_add(self, func, *a, **k): self.event_callback_add(EVAS_CALLBACK_KEY_DOWN, func, *a, **k) =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-evas/evas/evas.c_evas_object_callbacks.pxi,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- evas.c_evas_object_callbacks.pxi 17 Jul 2007 23:07:20 -0000 1.2 +++ evas.c_evas_object_callbacks.pxi 21 Sep 2007 23:56:05 -0000 1.3 @@ -1,5 +1,7 @@ # This file is included verbatim by c_evas.pyx +import traceback + cdef int cb_dispatcher(Object self, event, Evas_Callback_Type type) except 0: # iterate over copy since users may delete callback from callback lst = list(self._callbacks[<int>type]) @@ -7,7 +9,6 @@ try: func(self, event, *args, **kargs) except Exception, e: - import traceback traceback.print_exc() return 1 @@ -19,7 +20,6 @@ try: func(self, *args, **kargs) except Exception, e: - import traceback traceback.print_exc() return 1 =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-evas/evas/evas.c_evas_object_smart.pxi,v retrieving revision 1.14 retrieving revision 1.15 diff -u -3 -r1.14 -r1.15 --- evas.c_evas_object_smart.pxi 1 Sep 2007 15:59:30 -0000 1.14 +++ evas.c_evas_object_smart.pxi 21 Sep 2007 23:56:05 -0000 1.15 @@ -5,6 +5,7 @@ cdef object _smart_classes _smart_classes = list() +import traceback cdef void _smart_object_delete(Evas_Object *o): cdef SmartObject obj @@ -13,7 +14,6 @@ try: obj._m_delete(obj) except Exception, e: - import traceback traceback.print_exc() try: @@ -67,7 +67,6 @@ try: obj._m_move(obj, x, y) except Exception, e: - import traceback traceback.print_exc() @@ -78,7 +77,6 @@ try: obj._m_resize(obj, w, h) except Exception, e: - import traceback traceback.print_exc() @@ -89,7 +87,6 @@ try: obj._m_show(obj) except Exception, e: - import traceback traceback.print_exc() @@ -100,7 +97,6 @@ try: obj._m_hide(obj) except Exception, e: - import traceback traceback.print_exc() @@ -111,7 +107,6 @@ try: obj._m_color_set(obj, r, g, b, a) except Exception, e: - import traceback traceback.print_exc() @@ -124,7 +119,6 @@ try: obj._m_clip_set(obj, other) except Exception, e: - import traceback traceback.print_exc() @@ -135,7 +129,6 @@ try: obj._m_clip_unset(obj) except Exception, e: - import traceback traceback.print_exc() @@ -152,7 +145,6 @@ try: func(obj, ei, *args, **kargs) except Exception, e: - import traceback traceback.print_exc() @@ -315,11 +307,19 @@ lst.append((func, args, kargs)) def callback_del(self, char *event, func): - lst = self._smart_callbacks[event] + try: + lst = self._smart_callbacks[event] + except KeyError, e: + raise ValueError("Unknown event %r" % e) + i = -1 for i, (f, a, k) in enumerate(lst): if func == f: break + else: + raise ValueError("Callback %s was not registered with event %r" % + (func, e)) + del lst[i] if not lst: del self._smart_callbacks[event] ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs