kuuko pushed a commit to branch master.

http://git.enlightenment.org/bindings/python/python-efl.git/commit/?id=9e86901b0d9abd4b8824e347ee5fd773b36aa88e

commit 9e86901b0d9abd4b8824e347ee5fd773b36aa88e
Author: Kai Huuhko <kai.huu...@gmail.com>
Date:   Sun Mar 8 23:47:07 2015 +0200

    Evas.SmartObject: Add unicode/py3k safety to callback methods
---
 efl/evas/efl.evas_object_smart.pxi | 44 +++++++++++++++++++++-----------------
 1 file changed, 24 insertions(+), 20 deletions(-)

diff --git a/efl/evas/efl.evas_object_smart.pxi 
b/efl/evas/efl.evas_object_smart.pxi
index 6446fa7..d204a2a 100644
--- a/efl/evas/efl.evas_object_smart.pxi
+++ b/efl/evas/efl.evas_object_smart.pxi
@@ -662,10 +662,10 @@ cdef class SmartObject(Object):
     def smart_get(self):
         return 
<Smart>evas_smart_data_get(evas_object_smart_smart_get(self.obj))
 
-    def callback_add(self, char *event, func, *args, **kargs):
+    def callback_add(self, name, func, *args, **kargs):
         """Add a callback for the smart event specified by event.
 
-        :param event: Event name
+        :param name: Event name
         :param func:
             What to callback.
             Should have the signature::
@@ -682,55 +682,58 @@ cdef class SmartObject(Object):
         if not callable(func):
             raise TypeError("func must be callable")
 
-        # FIXME: Why is this interned?
-        #        What is the reason to use char * and cast it to void *?
-        e = intern(event)
-        lst = self._smart_callbacks.setdefault(e, [])
+        if isinstance(name, unicode): name = PyUnicode_AsUTF8String(name)
+
+        lst = self._smart_callbacks.setdefault(name, [])
         if not lst:
-            evas_object_smart_callback_add(self.obj, event, _smart_callback,
-                                           <void *>e)
+            evas_object_smart_callback_add(self.obj, name, _smart_callback,
+                                           <void *>name)
         lst.append((func, args, kargs))
 
-    def callback_del(self, char *event, func):
+    def callback_del(self, name, func):
         """callback_del(event, func)
 
         Remove a smart callback.
 
         Removes a callback that was added by :py:func:`callback_add()`.
 
-        :param event: event name
+        :param name: event name
         :param func: what to callback, should have be previously registered.
         :precond: **event** and **func** must be used as parameter for
            :py:func:`callback_add`.
 
         :raise ValueError: if there was no **func** connected with this event.
         """
+        if isinstance(name, unicode): name = PyUnicode_AsUTF8String(name)
+
         try:
-            lst = self._smart_callbacks[event]
+            lst = self._smart_callbacks[name]
         except KeyError:
-            raise ValueError("Unknown event %r" % event)
+            raise ValueError("Unknown event %r" % name)
+
+        cdef:
+            int i = -1
+            object f = None
 
-        i = -1
-        f = None
         for i, (f, a, k) in enumerate(lst):
             if func == f:
                 break
 
         if f != func:
             raise ValueError("Callback %s was not registered with event %r" %
-                             (func, event))
+                             (func, name))
         lst.pop(i)
         if lst:
             return
-        self._smart_callbacks.pop(event)
-        evas_object_smart_callback_del(self.obj, event, _smart_callback)
+        self._smart_callbacks.pop(name)
+        evas_object_smart_callback_del(self.obj, name, _smart_callback)
 
-    def callback_call(self, char *event, event_info=None):
+    def callback_call(self, name, event_info=None):
         """callback_call(event, event_info=None)
 
         Call any smart callbacks for event.
 
-        :param event: the event name
+        :param name: the event name
         :param event_info: an event specific info to pass to the callback.
 
         This should be called internally in the smart object when some
@@ -741,7 +744,8 @@ cdef class SmartObject(Object):
         .. attention::
             **event_info** will always be a python object.
         """
-        evas_object_smart_callback_call(self.obj, event, <void*>event_info)
+        if isinstance(name, unicode): name = PyUnicode_AsUTF8String(name)
+        evas_object_smart_callback_call(self.obj, name, <void*>event_info)
 
     def move_children_relative(self, int dx, int dy):
         """move_children_relative(int dx, int dy)

-- 


Reply via email to