Enlightenment CVS committal Author : barbieri Project : e17 Module : proto/python-efl
Dir : e17/proto/python-efl/python-ecore/ecore Modified Files: __init__.py ecore.c_ecore.pxd ecore.c_ecore_animator.pxi ecore.c_ecore_fd_handler.pxi ecore.c_ecore_idle_enterer.pxi ecore.c_ecore_idle_exiter.pxi ecore.c_ecore_idler.pxi ecore.c_ecore_timer.pxi python.pxd Log Message: Remove dependency on Numeric/array.h, improved __str__ and __repr__ and simplified ecore classes. * Numeric/array.h was just required to print reference count, this macro is now in python_evas_utils.h and we're clean. * __str__ was too verbose and not informative, it was improved with other attributes like color, geometry, name, clip and layer, but reference count and wrapped pointer are not there anymore, they made into new __repr__. * Following previous patch from Caio, this version remove class redefinition in ecore/__init__.py, also these classes were redone to work better, and the results are good, with less lines of code and better consistency. =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-ecore/ecore/__init__.py,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- __init__.py 19 Jul 2007 16:07:06 -0000 1.4 +++ __init__.py 2 Sep 2007 15:11:54 -0000 1.5 @@ -2,29 +2,18 @@ import c_ecore -shutdown = c_ecore.shutdown +from c_ecore import shutdown, time_get, timer_add, \ + main_loop_begin, main_loop_quit, main_loop_iterate, \ + animator_add, animator_frametime_set, animator_frametime_get, \ + idler_add, idle_enterer_add, idle_exiter_add, fd_handler_add, \ + Animator, Timer, Idler, IdleExiter, IdleEnterer, FdHandler -main_loop_begin = c_ecore.main_loop_begin -main_loop_quit = c_ecore.main_loop_quit -main_loop_iterate = c_ecore.main_loop_iterate - -time_get = c_ecore.time_get -timer_add = c_ecore.timer_add - -animator_add = c_ecore.animator_add -animator_frametime_set = c_ecore.animator_frametime_set -animator_frametime_get = c_ecore.animator_frametime_get - -idler_add = c_ecore.idler_add -idle_enterer_add = c_ecore.idle_enterer_add -idle_exiter_add = c_ecore.idle_exiter_add ECORE_FD_NONE = 0 ECORE_FD_READ = 1 ECORE_FD_WRITE = 2 ECORE_FD_ERROR = 4 ECORE_FD_ALL = 7 -fd_handler_add = c_ecore.fd_handler_add class MainLoop(object): @@ -39,41 +28,5 @@ @staticmethod def iterate(): main_loop_iterate() - - -class Timer(c_ecore.Timer): - def __new__(type, timeout, func, *args, **kargs): - obj = timer_add(timeout, func, *args, **kargs) - return obj - - -class Animator(c_ecore.Animator): - def __new__(type, func, *args, **kargs): - obj = animator_add(func, *args, **kargs) - return obj - - -class Idler(c_ecore.Idler): - def __new__(type, func, *args, **kargs): - obj = idler_add(func, *args, **kargs) - return obj - - -class IdleEnterer(c_ecore.IdleEnterer): - def __new__(type, func, *args, **kargs): - obj = idle_enterer_add(func, *args, **kargs) - return obj - - -class IdleExiter(c_ecore.IdleExiter): - def __new__(type, func, *args, **kargs): - obj = idle_exiter_add(func, *args, **kargs) - return obj - - -class FdHandler(c_ecore.FdHandler): - def __new__(type, fd, flags, func, *args, **kargs): - obj = fd_handler_add(fd, flags, func, *args, **kargs) - return obj c_ecore.init() =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-ecore/ecore/ecore.c_ecore.pxd,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- ecore.c_ecore.pxd 13 May 2007 20:51:38 -0000 1.3 +++ ecore.c_ecore.pxd 2 Sep 2007 15:11:54 -0000 1.4 @@ -1,3 +1,7 @@ +cdef extern from "python_evas_utils.h": + int PY_REFCOUNT(object) + + cdef extern from "Ecore.h": ctypedef enum Ecore_Fd_Handler_Flags: ECORE_FD_READ = 1 @@ -54,7 +58,7 @@ cdef object args cdef object kargs - cdef int _set_obj(self, Ecore_Timer *obj) except 0 + cdef object _exec(self) cdef class Animator: @@ -63,7 +67,7 @@ cdef object args cdef object kargs - cdef int _set_obj(self, Ecore_Animator *obj) except 0 + cdef object _exec(self) cdef class Idler: @@ -72,7 +76,7 @@ cdef object args cdef object kargs - cdef int _set_obj(self, Ecore_Idler *obj) except 0 + cdef object _exec(self) cdef class IdleEnterer: @@ -81,7 +85,7 @@ cdef object args cdef object kargs - cdef int _set_obj(self, Ecore_Idle_Enterer *obj) except 0 + cdef object _exec(self) cdef class IdleExiter: @@ -90,7 +94,7 @@ cdef object args cdef object kargs - cdef int _set_obj(self, Ecore_Idle_Exiter *obj) except 0 + cdef object _exec(self) cdef class FdHandler: @@ -100,4 +104,4 @@ cdef object kargs cdef object _prepare_callback - cdef int _set_obj(self, Ecore_Fd_Handler *obj) except 0 + cdef object _exec(self) =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-ecore/ecore/ecore.c_ecore_animator.pxi,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- ecore.c_ecore_animator.pxi 19 Jul 2007 15:06:44 -0000 1.3 +++ ecore.c_ecore_animator.pxi 2 Sep 2007 15:11:54 -0000 1.4 @@ -1,18 +1,44 @@ # This file is included verbatim by c_ecore.pyx +cdef int animator_cb(void *_td): + cdef Animator obj + cdef int r + + obj = <Animator>_td + + try: + r = bool(obj._exec()) + except Exception, e: + import traceback + traceback.print_exc() + r = 0 + + if not r: + obj.delete() + return r + + cdef class Animator: - def __init__(self, func, args, kargs): + def __init__(self, func, *args, **kargs): + if not callable(func): + raise TypeError("Parameter 'func' must be callable") self.func = func self.args = args self.kargs = kargs - self.obj = NULL + if self.obj == NULL: + self.obj = ecore_animator_add(animator_cb, <void *>self) + python.Py_INCREF(self) def __str__(self): + return "%s(func=%s, args=%s, kargs=%s)" % \ + (self.__class__.__name__, self.func, self.args, self.kargs) + + def __repr__(self): return ("%s(0x%x, func=%s, args=%s, kargs=%s, Ecore_Animator=0x%x, " "refcount=%d)") % \ (self.__class__.__name__, <unsigned long>self, self.func, self.args, self.kargs, - <unsigned long>self.obj, python.REFCOUNT(self)) + <unsigned long>self.obj, PY_REFCOUNT(self)) def __dealloc__(self): if self.obj != NULL: @@ -22,13 +48,7 @@ self.args = None self.kargs = None - cdef int _set_obj(self, Ecore_Animator *obj) except 0: - assert self.obj == NULL, "Object must be clean" - self.obj = obj - python.Py_INCREF(self) - return 1 - - def _exec(self): + cdef _exec(self): return self.func(*self.args, **self.kargs) def delete(self): @@ -41,32 +61,5 @@ self.delete() -cdef int animator_cb(void *_td): - cdef int r - - obj = <Animator>_td - - try: - r = bool(obj._exec()) - except Exception, e: - import traceback - traceback.print_exc() - r = 0 - - if not r: - obj.delete() - return r - - def animator_add(func, *args, **kargs): - cdef Ecore_Animator *h - cdef Animator obj - - if not callable(func): - raise TypeError("Parameter 'func' must be callable") - - obj = Animator(func, args, kargs) - - h = ecore_animator_add(animator_cb, <void *>obj) - obj._set_obj(h) - return obj + return Animator(func, *args, **kargs) =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-ecore/ecore/ecore.c_ecore_fd_handler.pxi,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- ecore.c_ecore_fd_handler.pxi 19 Jul 2007 15:06:44 -0000 1.3 +++ ecore.c_ecore_fd_handler.pxi 2 Sep 2007 15:11:54 -0000 1.4 @@ -1,8 +1,8 @@ # This file is included verbatim by c_ecore.pyx cdef void fd_handler_prepare_cb(void *_td, Ecore_Fd_Handler *fdh): - cdef int r cdef FdHandler obj + cdef int r obj = <FdHandler>_td if obj._prepare_callback is None: @@ -15,13 +15,55 @@ traceback.print_exc() +cdef flags2str(int value): + flags = [] + if value & <int>ECORE_FD_READ: + flags.append("READ") + if value & <int>ECORE_FD_WRITE: + flags.append("WRITE") + if value & <int>ECORE_FD_ERROR: + flags.append("ERROR") + return ", ".join(flags) + + +cdef int fd_handler_cb(void *_td, Ecore_Fd_Handler *fdh): + cdef FdHandler obj + cdef int r + + obj = <FdHandler>_td + + try: + r = bool(obj._exec()) + except Exception, e: + import traceback + traceback.print_exc() + r = 0 + + if not r: + obj.delete() + return r + + cdef class FdHandler: - def __init__(self, func, args, kargs): + def __init__(self, fd, int flags, func, *args, **kargs): + if not callable(func): + raise TypeError("Parameter 'func' must be callable") self.func = func self.args = args self.kargs = kargs - self.obj = NULL self._prepare_callback = None + if self.obj == NULL: + if not isinstance(fd, (int, long)): + try: + fd = fd.fileno() + except AttributeError, e: + raise ValueError("fd must be integer or have fileno()") + + self.obj = ecore_main_fd_handler_add(fd, + <Ecore_Fd_Handler_Flags>flags, + fd_handler_cb, <void *>self, + NULL, NULL) + python.Py_INCREF(self) def __str__(self): if self.obj == NULL: @@ -29,20 +71,23 @@ flags = "" else: fd = self.fd_get() - v = self.active_get(7) - flags = [] - if v & ECORE_FD_READ: - flags.append("READ") - if v & ECORE_FD_WRITE: - flags.append("WRITE") - if v & ECORE_FD_ERROR: - flags.append("ERROR") - flags = ", ".join(flags) + flags = flags2str(self.active_get(7)) + return "%s(func=%s, args=%s, kargs=%s, fd=%s, flags=[%s])" % \ + (self.__class__.__name__, self.func, self.args, self.kargs, + fd, flags) + + def __repr__(self): + if self.obj == NULL: + fd = None + flags = "" + else: + fd = self.fd_get() + flags = flags2str(self.active_get(7)) return ("%s(0x%x, func=%s, args=%s, kargs=%s, fd=%s, flags=[%s], " "Ecore_Fd_Handler=0x%x, refcount=%d)") % \ (self.__class__.__name__, <unsigned long>self, self.func, self.args, self.kargs, fd, flags, - <unsigned long>self.obj, python.REFCOUNT(self)) + <unsigned long>self.obj, PY_REFCOUNT(self)) def __dealloc__(self): if self.obj != NULL: @@ -52,13 +97,7 @@ self.args = None self.kargs = None - cdef int _set_obj(self, Ecore_Fd_Handler *obj) except 0: - assert self.obj == NULL, "Object must be clean" - self.obj = obj - python.Py_INCREF(self) - return 1 - - def _exec(self): + cdef object _exec(self): return self.func(self, *self.args, **self.kargs) def delete(self): @@ -110,35 +149,5 @@ raise TypeError("Parameter 'func' must be callable") -cdef int fd_handler_cb(void *_td, Ecore_Fd_Handler *fdh): - cdef int r - - obj = <FdHandler>_td - - try: - r = bool(obj._exec()) - except Exception, e: - import traceback - traceback.print_exc() - r = 0 - - if not r: - obj.delete() - return r - - -def fd_handler_add(int fd, int flags, func, *args, **kargs): - cdef Ecore_Fd_Handler *h - cdef Ecore_Fd_Handler_Flags v - cdef FdHandler obj - - if not callable(func): - raise TypeError("Parameter 'func' must be callable") - - obj = FdHandler(func, args, kargs) - - v = <Ecore_Fd_Handler_Flags>flags - h = ecore_main_fd_handler_add(fd, v, fd_handler_cb, <void *>obj, - NULL, NULL) - obj._set_obj(h) - return obj +def fd_handler_add(fd, int flags, func, *args, **kargs): + return FdHandler(fd, flags, func, *args, **kargs) =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-ecore/ecore/ecore.c_ecore_idle_enterer.pxi,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- ecore.c_ecore_idle_enterer.pxi 19 Jul 2007 15:06:44 -0000 1.3 +++ ecore.c_ecore_idle_enterer.pxi 2 Sep 2007 15:11:54 -0000 1.4 @@ -1,18 +1,44 @@ # This file is included verbatim by c_ecore.pyx +cdef int idle_enterer_cb(void *_td): + cdef IdleEnterer obj + cdef int r + + obj = <IdleEnterer>_td + + try: + r = bool(obj._exec()) + except Exception, e: + import traceback + traceback.print_exc() + r = 0 + + if not r: + obj.delete() + return r + + cdef class IdleEnterer: - def __init__(self, func, args, kargs): + def __init__(self, func, *args, **kargs): + if not callable(func): + raise TypeError("Parameter 'func' must be callable") self.func = func self.args = args self.kargs = kargs - self.obj = NULL + if self.obj == NULL: + self.obj = ecore_idle_enterer_add(idle_enterer_cb, <void *>self) + python.Py_INCREF(self) def __str__(self): + return "%s(func=%s, args=%s, kargs=%s)" % \ + (self.__class__.__name__, self.func, self.args, self.kargs) + + def __repr__(self): return ("%s(0x%x, func=%s, args=%s, kargs=%s, " "Ecore_Idle_Enterer=0x%x, refcount=%d)") % \ (self.__class__.__name__, <unsigned long>self, self.func, self.args, self.kargs, - <unsigned long>self.obj, python.REFCOUNT(self)) + <unsigned long>self.obj, PY_REFCOUNT(self)) def __dealloc__(self): if self.obj != NULL: @@ -22,13 +48,7 @@ self.args = None self.kargs = None - cdef int _set_obj(self, Ecore_Idle_Enterer *obj) except 0: - assert self.obj == NULL, "Object must be clean" - self.obj = obj - python.Py_INCREF(self) - return 1 - - def _exec(self): + cdef object _exec(self): return self.func(*self.args, **self.kargs) def delete(self): @@ -41,32 +61,5 @@ self.delete() -cdef int idle_enterer_cb(void *_td): - cdef int r - - obj = <IdleEnterer>_td - - try: - r = bool(obj._exec()) - except Exception, e: - import traceback - traceback.print_exc() - r = 0 - - if not r: - obj.delete() - return r - - def idle_enterer_add(func, *args, **kargs): - cdef Ecore_Idle_Enterer *h - cdef IdleEnterer obj - - if not callable(func): - raise TypeError("Parameter 'func' must be callable") - - obj = IdleEnterer(func, args, kargs) - - h = ecore_idle_enterer_add(idle_enterer_cb, <void *>obj) - obj._set_obj(h) - return obj + return IdleEnterer(func, *args, **kargs) =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-ecore/ecore/ecore.c_ecore_idle_exiter.pxi,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- ecore.c_ecore_idle_exiter.pxi 19 Jul 2007 15:06:44 -0000 1.3 +++ ecore.c_ecore_idle_exiter.pxi 2 Sep 2007 15:11:54 -0000 1.4 @@ -1,18 +1,44 @@ # This file is included verbatim by c_ecore.pyx +cdef int idle_exiter_cb(void *_td): + cdef IdleExiter obj + cdef int r + + obj = <IdleExiter>_td + + try: + r = bool(obj._exec()) + except Exception, e: + import traceback + traceback.print_exc() + r = 0 + + if not r: + obj.delete() + return r + + cdef class IdleExiter: - def __init__(self, func, args, kargs): + def __init__(self, func, *args, **kargs): + if not callable(func): + raise TypeError("Parameter 'func' must be callable") self.func = func self.args = args self.kargs = kargs - self.obj = NULL + if self.obj == NULL: + self.obj = ecore_idle_exiter_add(idle_exiter_cb, <void *>self) + python.Py_INCREF(self) def __str__(self): + return "%s(func=%s, args=%s, kargs=%s)" % \ + (self.__class__.__name__, self.func, self.args, self.kargs) + + def __repr__(self): return ("%s(0x%x, func=%s, args=%s, kargs=%s, Ecore_Idle_Exiter=0x%x, " "refcount=%d)") % \ (self.__class__.__name__, <unsigned long>self, self.func, self.args, self.kargs, - <unsigned long>self.obj, python.REFCOUNT(self)) + <unsigned long>self.obj, PY_REFCOUNT(self)) def __dealloc__(self): if self.obj != NULL: @@ -22,13 +48,7 @@ self.args = None self.kargs = None - cdef int _set_obj(self, Ecore_Idle_Exiter *obj) except 0: - assert self.obj == NULL, "Object must be clean" - self.obj = obj - python.Py_INCREF(self) - return 1 - - def _exec(self): + cdef object _exec(self): return self.func(*self.args, **self.kargs) def delete(self): @@ -41,32 +61,5 @@ self.delete() -cdef int idle_exiter_cb(void *_td): - cdef int r - - obj = <IdleExiter>_td - - try: - r = bool(obj._exec()) - except Exception, e: - import traceback - traceback.print_exc() - r = 0 - - if not r: - obj.delete() - return r - - def idle_exiter_add(func, *args, **kargs): - cdef Ecore_Idle_Exiter *h - cdef IdleExiter obj - - if not callable(func): - raise TypeError("Parameter 'func' must be callable") - - obj = IdleExiter(func, args, kargs) - - h = ecore_idle_exiter_add(idle_exiter_cb, <void *>obj) - obj._set_obj(h) - return obj + return IdleExiter(func, *args, **kargs) =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-ecore/ecore/ecore.c_ecore_idler.pxi,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- ecore.c_ecore_idler.pxi 19 Jul 2007 15:06:44 -0000 1.3 +++ ecore.c_ecore_idler.pxi 2 Sep 2007 15:11:54 -0000 1.4 @@ -1,18 +1,42 @@ # This file is included verbatim by c_ecore.pyx +cdef int idler_cb(void *_td): + cdef Idler obj + cdef int r + + obj = <Idler>_td + + try: + r = bool(obj._exec()) + except Exception, e: + import traceback + traceback.print_exc() + r = 0 + + if not r: + obj.delete() + return r + + cdef class Idler: - def __init__(self, func, args, kargs): + def __init__(self, func, *args, **kargs): self.func = func self.args = args self.kargs = kargs - self.obj = NULL + if self.obj == NULL: + self.obj = ecore_idler_add(idler_cb, <void *>self) + python.Py_INCREF(self) def __str__(self): + return "%s(func=%s, args=%s, kargs=%s)" % \ + (self.__class__.__name__, self.func, self.args, self.kargs) + + def __repr__(self): return ("%s(0x%x, func=%s, args=%s, kargs=%s, Ecore_Idler=0x%x, " "refcount=%d)") % \ (self.__class__.__name__, <unsigned long>self, self.func, self.args, self.kargs, - <unsigned long>self.obj, python.REFCOUNT(self)) + <unsigned long>self.obj, PY_REFCOUNT(self)) def __dealloc__(self): if self.obj != NULL: @@ -22,13 +46,7 @@ self.args = None self.kargs = None - cdef int _set_obj(self, Ecore_Idler *obj) except 0: - assert self.obj == NULL, "Object must be clean" - self.obj = obj - python.Py_INCREF(self) - return 1 - - def _exec(self): + cdef object _exec(self): return self.func(*self.args, **self.kargs) def delete(self): @@ -41,32 +59,5 @@ self.delete() -cdef int idler_cb(void *_td): - cdef int r - - obj = <Idler>_td - - try: - r = bool(obj._exec()) - except Exception, e: - import traceback - traceback.print_exc() - r = 0 - - if not r: - obj.delete() - return r - - def idler_add(func, *args, **kargs): - cdef Ecore_Idler *h - cdef Idler obj - - if not callable(func): - raise TypeError("Parameter 'func' must be callable") - - obj = Idler(func, args, kargs) - - h = ecore_idler_add(idler_cb, <void *>obj) - obj._set_obj(h) - return obj + return Idler(func, *args, **kargs) =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-ecore/ecore/ecore.c_ecore_timer.pxi,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- ecore.c_ecore_timer.pxi 19 Jul 2007 15:06:44 -0000 1.3 +++ ecore.c_ecore_timer.pxi 2 Sep 2007 15:11:54 -0000 1.4 @@ -1,19 +1,46 @@ # This file is included verbatim by c_ecore.pyx +cdef int timer_cb(void *_td): + cdef Timer obj + cdef int r + + obj = <Timer>_td + + try: + r = bool(obj._exec()) + except Exception, e: + import traceback + traceback.print_exc() + r = 0 + + if not r: + obj.delete() + return r + + cdef class Timer: - def __init__(self, double interval, func, args, kargs): + def __init__(self, double interval, func, *args, **kargs): + if not callable(func): + raise TypeError("Parameter 'func' must be callable") self._interval = interval self.func = func self.args = args self.kargs = kargs - self.obj = NULL + if self.obj == NULL: + self.obj = ecore_timer_add(interval, timer_cb, <void *>self) + python.Py_INCREF(self) def __str__(self): + return "%s(interval=%f, func=%s, args=%s, kargs=%s)" % \ + (self.__class__.__name__, self._interval, + self.func, self.args, self.kargs) + + def __repr__(self): return ("%s(0x%x, interval=%f, func=%s, args=%s, kargs=%s, " "Ecore_Timer=0x%x, refcount=%d)") % \ (self.__class__.__name__, <unsigned long>self, self._interval, self.func, self.args, self.kargs, - <unsigned long>self.obj, python.REFCOUNT(self)) + <unsigned long>self.obj, PY_REFCOUNT(self)) def __dealloc__(self): if self.obj != NULL: @@ -23,13 +50,7 @@ self.args = None self.kargs = None - cdef int _set_obj(self, Ecore_Timer *obj) except 0: - assert self.obj == NULL, "Object must be clean" - self.obj = obj - python.Py_INCREF(self) - return 1 - - def _exec(self): + cdef object _exec(self): return self.func(*self.args, **self.kargs) def delete(self): @@ -57,32 +78,5 @@ ecore_timer_interval_set(self.obj, t) -cdef int timer_cb(void *_td): - cdef int r - - obj = <Timer>_td - - try: - r = bool(obj._exec()) - except Exception, e: - import traceback - traceback.print_exc() - r = 0 - - if not r: - obj.delete() - return r - - def timer_add(double t, func, *args, **kargs): - cdef Ecore_Timer *h - cdef Timer obj - - if not callable(func): - raise TypeError("Parameter 'func' must be callable") - - obj = Timer(t, func, args, kargs) - - h = ecore_timer_add(t, timer_cb, <void *>obj) - obj._set_obj(h) - return obj + return Timer(t, func, *args, **kargs) =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-ecore/ecore/python.pxd,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- python.pxd 30 Apr 2007 20:17:47 -0000 1.1 +++ python.pxd 2 Sep 2007 15:11:54 -0000 1.2 @@ -81,8 +81,3 @@ object PyBuffer_FromMemory(void *ptr, int size) object PyBuffer_FromReadWriteMemory(void *ptr, int size) object PyBuffer_New(int size) - - - -cdef extern from "Numeric/arrayobject.h": - int REFCOUNT(object) ------------------------------------------------------------------------- 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