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