Enlightenment CVS committal

Author  : ulisses
Project : e17
Module  : proto/python-efl

Dir     : e17/proto/python-efl/python-edje/edje


Modified Files:
        edje.c_edje.pyx edje.c_edje_object.pxi 


Log Message:
Adding metaclass to extension types to optimize register of decorated methods.

===================================================================
RCS file: /cvs/e/e17/proto/python-efl/python-edje/edje/edje.c_edje.pyx,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- edje.c_edje.pyx     1 Oct 2007 06:34:28 -0000       1.6
+++ edje.c_edje.pyx     8 Oct 2007 00:04:08 -0000       1.7
@@ -230,5 +230,45 @@
     edje_extern_object_aspect_set(obj.obj, <Edje_Aspect_Control>aspect, w, h)
 
 
+cdef void _install_metaclass(python.PyTypeObject *ctype, object metaclass):
+    python.Py_INCREF(metaclass)
+    ctype.ob_type = <python.PyTypeObject*>metaclass
+
+
 include "edje.c_edje_message.pxi"
 include "edje.c_edje_object.pxi"
+
+
+class EdjeMeta(evas.c_evas.EvasMeta):
+    def __init__(cls, name, bases, dict_):
+        evas.c_evas.EvasMeta.__init__(cls, name, bases, dict_)
+        cls._fetch_callbacks()
+
+    def _fetch_callbacks(cls):
+        if "__edje_signal_callbacks__" in cls.__dict__:
+            return
+
+        cls.__edje_signal_callbacks__ = []
+        cls.__edje_message_callbacks__ = []
+        cls.__edje_text_callbacks__ = []
+
+        sig_append = cls.__edje_signal_callbacks__.append
+        msg_append = cls.__edje_message_callbacks__.append
+        txt_append = cls.__edje_text_callbacks__.append
+
+        for name in dir(cls):
+            val = getattr(cls, name)
+            if not callable(val):
+                continue
+
+            if hasattr(val, "edje_signal_callback"):
+                sig_data = getattr(val, "edje_signal_callback")
+                sig_append((name, sig_data))
+            elif hasattr(val, "edje_message_handler"):
+                msg_append(name)
+            elif hasattr(val, "edje_text_change_callback"):
+                txt_append(name)
+
+
+# installing metaclass for all extension types
+_edje_install_metaclass(EdjeMeta)
===================================================================
RCS file: /cvs/e/e17/proto/python-efl/python-edje/edje/edje.c_edje_object.pxi,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -3 -r1.20 -r1.21
--- edje.c_edje_object.pxi      1 Oct 2007 06:34:28 -0000       1.20
+++ edje.c_edje_object.pxi      8 Oct 2007 00:04:08 -0000       1.21
@@ -45,16 +45,20 @@
 
 
 cdef _register_decorated_callbacks(obj):
-    for attr_name in dir(obj):
+    if not hasattr(obj, "__edje_signal_callbacks__"):
+        return
+
+    for attr_name, sig_data in obj.__edje_signal_callbacks__:
+        attr_value = getattr(obj, attr_name)
+        obj.signal_callback_add(sig_data[0], sig_data[1], attr_value)
+
+    for attr_name in obj.__edje_message_callbacks__:
+        attr_value = getattr(obj, attr_name)
+        obj.message_handler_set(attr_value)
+
+    for attr_name in obj.__edje_text_callbacks__:
         attr_value = getattr(obj, attr_name)
-        if callable(attr_value):
-            if hasattr(attr_value, "edje_signal_callback"):
-                emission, source = getattr(attr_value, "edje_signal_callback")
-                obj.signal_callback_add(emission, source, attr_value)
-            elif hasattr(attr_value, "edje_text_change_callback"):
-                obj.text_change_cb_set(attr_value)
-            elif hasattr(attr_value, "edje_message_handler"):
-                obj.message_handler_set(attr_value)
+        obj.text_change_cb_set(attr_value)
 
 
 class EdjeLoadError(Exception):
@@ -85,7 +89,7 @@
         Exception.__init__(self, "%s (file=%r, group=%r)" % (msg, file, group))
 
 
-cdef class Edje(evas.c_evas.Object):
+cdef public class Edje(evas.c_evas.Object) [object PyEdje, type PyEdje_Type]:
     """Edje evas object.
 
     This is a high level L{evas.SmartObject} that is defined as a group of
@@ -724,3 +728,10 @@
 
 
 evas.c_evas._object_mapping_register("edje", Edje)
+
+
+cdef extern from "Python.h":
+    cdef python.PyTypeObject PyEdje_Type # hack to install metaclass
+
+cdef void _edje_install_metaclass(object metaclass):
+    _install_metaclass(&PyEdje_Type, metaclass)



-------------------------------------------------------------------------
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