Evas.SmartObject: Keep refs in a list

Using Py_INCREF/DECREF in add/del we could have dangling references when
the object is deleted without user calling callback_del.
This commit is contained in:
Kai Huuhko 2015-03-11 11:36:50 +02:00
parent 7fad9e3ff4
commit d36b61e97e
2 changed files with 14 additions and 7 deletions

View File

@ -591,6 +591,9 @@ cdef class SmartObject(Object):
should be instantiated and passed to this classes constructor as
parameter ``smart``
"""
def __cinit__(self):
self._owned_references = list()
def __init__(self, Canvas canvas not None, Smart smart not None, **kwargs):
#_smart_classes.append(<uintptr_t>cls_def)
self._set_obj(evas_object_smart_add(canvas.obj, smart.cls))
@ -749,7 +752,8 @@ cdef class SmartObject(Object):
if isinstance(event, unicode): event = PyUnicode_AsUTF8String(event)
spec = (event_conv, func, args, kargs)
Py_INCREF(spec)
self._owned_references.append(spec)
#Py_INCREF(spec)
evas_object_smart_callback_add(self.obj,
<const char *>event if event is not None else NULL,
@ -789,7 +793,8 @@ cdef class SmartObject(Object):
return 1
else:
spec = <tuple>tmp
Py_DECREF(spec)
self._owned_references.remove(spec)
#Py_DECREF(spec)
return 1

View File

@ -1205,11 +1205,13 @@ cdef class Textblock(Object):
cdef class SmartObject(Object):
cdef int _set_obj(self, cEo *obj) except 0
cdef int _callback_add_full(self, event, event_conv, func, tuple args, dict kargs) except 0
cdef int _callback_del_full(self, event, event_conv, func) except 0
cdef int _callback_add(self, event, func, args, kargs) except 0
cdef int _callback_del(self, event, func) except 0
cdef:
list _owned_references
int _set_obj(self, cEo *obj) except 0
int _callback_add_full(self, event, event_conv, func, tuple args, dict kargs) except 0
int _callback_del_full(self, event, event_conv, func) except 0
int _callback_add(self, event, func, args, kargs) except 0
int _callback_del(self, event, func) except 0
cdef class ClippedSmartObject(SmartObject):