Enlightenment CVS committal Author : barbieri Project : e17 Module : proto/python-efl
Dir : e17/proto/python-efl/python-evas/evas Modified Files: evas.c_evas_object.pxi Log Message: Fix free callback, it need to be handled specially. =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-evas/evas/evas.c_evas_object.pxi,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- evas.c_evas_object.pxi 15 Aug 2007 14:03:34 -0000 1.9 +++ evas.c_evas_object.pxi 22 Aug 2007 15:44:16 -0000 1.10 @@ -5,6 +5,16 @@ 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] + for func, args, kargs in lst: + try: + func(self, *args, **kargs) + except Exception, e: + import traceback + traceback.print_exc() + python.Py_DECREF(self) @@ -16,6 +26,41 @@ obj.event_callback_add(t, attr_value) +cdef _add_callback_to_list(Object obj, int type, func, args, kargs): + if type < 0 or type >= evas_event_callbacks_len: + raise ValueError("Invalid callback type") + + r = (func, args, kargs) + lst = obj._callbacks[type] + if lst is not None: + lst.append(r) + return False + else: + obj._callbacks[type] = [r] + return True + + +cdef _del_callback_from_list(Object obj, int type, func): + if type < 0 or type >= evas_event_callbacks_len: + raise ValueError("Invalid callback type") + + lst = obj._callbacks[type] + if not lst: + raise ValueError("Callback %s was not registered with type %d" % + (func, type)) + + i = None + for i, r in enumerate(lst): + if func == r[0]: + break + else: + raise ValueError("Callback %s was not registered with type %d" % + (func, type)) + + del lst[i] + return len(lst) == 0 + + cdef public class Object [object PyEvasObject, type PyEvasObject_Type]: def __new__(self, *a, **ka): self.obj = NULL @@ -513,15 +558,7 @@ def event_callback_add(self, int type, func, *args, **kargs): cdef evas_event_callback_t cb - if type < 0 or type >= evas_event_callbacks_len: - raise ValueError("Invalid callback type") - - r = (func, args, kargs) - lst = self._callbacks[type] - if lst is not None: - lst.append(r) - else: - self._callbacks[type] = [r] + 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, @@ -529,24 +566,7 @@ def event_callback_del(self, int type, func): cdef evas_event_callback_t cb - if type < 0 or type >= evas_event_callbacks_len: - raise ValueError("Invalid callback type") - - lst = self._callbacks[type] - if not lst: - raise ValueError("Callback %s was not registered with type %d" % - (func, type)) - - i = None - for i, r in enumerate(lst): - if func == r[0]: - break - else: - raise ValueError("Callback %s was not registered with type %d" % - (func, type)) - - del lst[i] - if len(lst) == 0: + if _del_callback_from_list(self, type, func): self._callbacks[type] = None cb = evas_event_callbacks[type] evas_object_event_callback_del(self.obj, @@ -589,10 +609,10 @@ self.event_callback_del(EVAS_CALLBACK_MOUSE_WHEEL, func) def on_free_add(self, func, *a, **k): - self.event_callback_add(EVAS_CALLBACK_FREE, func, *a, **k) + _add_callback_to_list(self, EVAS_CALLBACK_FREE, func, a, k) def on_free_del(self, func): - self.event_callback_del(EVAS_CALLBACK_FREE, func) + _del_callback_from_list(self, EVAS_CALLBACK_FREE, func) def on_key_down_add(self, func, *a, **k): self.event_callback_add(EVAS_CALLBACK_KEY_DOWN, func, *a, **k) ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs