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

Reply via email to