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

Reply via email to