Update of /cvsroot/freevo/kaa/evas/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11264

Modified Files:
        __init__.py evas.c evas.h object.c 
Log Message:
Add name set/get/find to objects.  Give evas object a dependencies list 
that traverses it during gc but doesn't dealloc it.  (Causes evas not to 
get dealloc'd before anything in the dependency list during garbage
collection.  This is kludgey but I couldn't see a better way.)


Index: object.c
===================================================================
RCS file: /cvsroot/freevo/kaa/evas/src/object.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** object.c    10 Jul 2005 20:44:35 -0000      1.1
--- object.c    13 Jul 2005 18:10:11 -0000      1.2
***************
*** 35,39 ****
      if (!data)
          return 0;
!     printf("Attr foreach: %s (visit=%d)\n", key, d->type);
      if (d->type == 0) {
          Py_DECREF((PyObject *)data);
--- 35,39 ----
      if (!data)
          return 0;
!     //printf("Attr foreach: %s (visit=%d)\n", key, d->type);
      if (d->type == 0) {
          Py_DECREF((PyObject *)data);
***************
*** 41,45 ****
      } else {
          d->ret = d->visit(data, d->arg);
!         return d->ret == 0;
      }
  }
--- 41,45 ----
      } else {
          d->ret = d->visit(data, d->arg);
!         return d->ret != 0;
      }
  }
***************
*** 50,53 ****
--- 50,61 ----
      Evas_PyObject *evas;
      Evas_Hash *attrs;
+     int ref;
+ 
+     ref = (int)evas_object_data_get(self->object, "ref") - 1;
+     evas_object_data_set(self->object, "ref", (void *)ref);
+ 
+     //printf("Object refcount: %d\n", ref);
+     if (ref) 
+         return 0;
  
      evas = evas_object_data_get(self->object, "evas_pyobject");
***************
*** 77,81 ****
      Evas_PyObject *evas;
      Evas_Hash *attrs;
!     int ret;
  
      attrs = evas_object_data_get(self->object, "pyattrs");
--- 85,92 ----
      Evas_PyObject *evas;
      Evas_Hash *attrs;
!     int ret, ref;
! 
!     if (evas_object_data_get(self->object, "ref"))
!         return 0;
  
      attrs = evas_object_data_get(self->object, "pyattrs");
***************
*** 103,107 ****
  Evas_Object_PyObject__dealloc(Evas_Object_PyObject * self)
  {
!     //printf("Evas_Object_PyObject dealloc\n");
      Evas_Object_PyObject__clear(self);
      self->ob_type->tp_free((PyObject*)self);
--- 114,118 ----
  Evas_Object_PyObject__dealloc(Evas_Object_PyObject * self)
  {
!     //printf("Evas object dealloc\n");
      Evas_Object_PyObject__clear(self);
      self->ob_type->tp_free((PyObject*)self);
***************
*** 112,121 ****
  {
      Evas_Object_PyObject *o;
  
      o = (Evas_Object_PyObject 
*)Evas_Object_PyObject__new(&Evas_Object_PyObject_Type, NULL, NULL);
!     if (evas) {
          Py_INCREF(evas);
          evas_object_data_set(evas_object, "evas_pyobject", evas);
      }
      o->object = evas_object;
      return o;
--- 123,138 ----
  {
      Evas_Object_PyObject *o;
+     int ref;
  
      o = (Evas_Object_PyObject 
*)Evas_Object_PyObject__new(&Evas_Object_PyObject_Type, NULL, NULL);
!     if (evas && !evas_object_data_get(evas_object, "evas_pyobject")) {
          Py_INCREF(evas);
          evas_object_data_set(evas_object, "evas_pyobject", evas);
      }
+ 
+     // It's possible for multiple Evas_Object_PyObjects to wrap one
+     // Evas_Object, so we maintain a refcount.
+     ref = (int)evas_object_data_get(evas_object, "ref");
+     evas_object_data_set(evas_object, "ref", (void *)ref+1);
      o->object = evas_object;
      return o;
***************
*** 127,131 ****
  Evas_Object_PyObject_type_get(Evas_Object_PyObject * self, PyObject * args)
  {
!     return Py_INCREF(Py_None), Py_None;
  }
  
--- 144,148 ----
  Evas_Object_PyObject_type_get(Evas_Object_PyObject * self, PyObject * args)
  {
!     return Py_BuildValue("s", evas_object_type_get(self->object));
  }
  
***************
*** 239,242 ****
--- 256,276 ----
  
  
+ PyObject *
+ Evas_Object_PyObject_name_set(Evas_Object_PyObject * self, PyObject * args)
+ {
+     char *name;
+ 
+     if (!PyArg_ParseTuple(args, "s", &name))
+         return NULL;
+ 
+     evas_object_name_set(self->object, name);
+     return Py_INCREF(Py_None), Py_None;
+ }
+ 
+ PyObject *
+ Evas_Object_PyObject_name_get(Evas_Object_PyObject * self, PyObject * args)
+ {
+     return Py_BuildValue("s", evas_object_name_get(self->object));
+ }
  
  /**************************************************************************
***************
*** 257,260 ****
--- 291,296 ----
      {"color_set", (PyCFunction) Evas_Object_PyObject_color_set, METH_VARARGS},
      {"color_get", (PyCFunction) Evas_Object_PyObject_color_get, METH_VARARGS},
+     {"name_set", (PyCFunction) Evas_Object_PyObject_name_set, METH_VARARGS},
+     {"name_get", (PyCFunction) Evas_Object_PyObject_name_get, METH_VARARGS},
  
  /* TODO:
***************
*** 338,345 ****
  
      old_value = evas_hash_find(attrs, sname);
-     if (old_value) {
-         Py_DECREF(old_value);
-     }
- 
      if (value == 0)
          attrs = evas_hash_del(attrs, sname, old_value);
--- 374,377 ----
***************
*** 350,353 ****
--- 382,387 ----
              evas_object_data_set(self->object, "pyattrs", attrs);
      }
+     if (old_value)
+         Py_DECREF(old_value);
  
      return 0;

Index: __init__.py
===================================================================
RCS file: /cvsroot/freevo/kaa/evas/src/__init__.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** __init__.py 10 Jul 2005 20:44:35 -0000      1.1
--- __init__.py 13 Jul 2005 18:10:11 -0000      1.2
***************
*** 101,104 ****
--- 101,110 ----
          return self._object.visible_get()
  
+     def visible_set(self, visible):
+         if visible:
+             self.show()
+         else:
+             self.hide()
+ 
      def color_get(self):
          return self._object.color_get()
***************
*** 112,116 ****
--- 118,128 ----
          (r, g, b, a) =  map(lambda x: min(255, max(0, x)), (r, g, b, a))
          return self._object.color_set(r, g, b, a)
+      
+      
+     def name_set(self, name):
+         self._object.name_set(name)
          
+     def name_get(self):
+         return self._object.name_get()
  
  
***************
*** 279,282 ****
--- 291,296 ----
  
      def __getattr__(self, key):
+         if key == "_dependencies":
+             return self._evas.dependencies
          if key in self.__dict__:
              return self.__dict__[key]
***************
*** 331,335 ****
      def damage_rectangle_add(self, ((x, y), (w, h))):
          self._evas.damage_rectangle_add(x, y, w, h)
!         
  
  class EvasBuffer(Evas):
--- 345,362 ----
      def damage_rectangle_add(self, ((x, y), (w, h))):
          self._evas.damage_rectangle_add(x, y, w, h)
! 
!     def object_name_find(self, name):
!         obj = self._evas.object_name_find(name)
!         if not obj:
!             return None
! 
!         obj_type = obj.type_get()
!         if obj_type == "image":
!             return Image(obj)
!         elif obj_type == "Rectangle":
!             return Rectangle(obj)
!         elif obj_type == "Text":
!             return Text(obj)
! 
  
  class EvasBuffer(Evas):
***************
*** 345,349 ****
          if "buffer" not in kwargs:
              kwargs["buffer"] = array.array('c', '\0'*size[0]*size[1]*bpp)
!         self._buffer = kwargs["buffer"]
          kwargs["size"] = size
          assert type(kwargs["buffer"]) in (array.array, buffer, int)
--- 372,376 ----
          if "buffer" not in kwargs:
              kwargs["buffer"] = array.array('c', '\0'*size[0]*size[1]*bpp)
!         #self._buffer = kwargs["buffer"]
          kwargs["size"] = size
          assert type(kwargs["buffer"]) in (array.array, buffer, int)

Index: evas.h
===================================================================
RCS file: /cvsroot/freevo/kaa/evas/src/evas.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** evas.h      10 Jul 2005 20:44:35 -0000      1.1
--- evas.h      13 Jul 2005 18:10:11 -0000      1.2
***************
*** 13,17 ****
      PyObject_HEAD
      Evas *evas;
!     PyObject *dict;
  } Evas_PyObject;
  
--- 13,17 ----
      PyObject_HEAD
      Evas *evas;
!     PyObject *dict, *dependencies;
  } Evas_PyObject;
  

Index: evas.c
===================================================================
RCS file: /cvsroot/freevo/kaa/evas/src/evas.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** evas.c      10 Jul 2005 20:46:17 -0000      1.1
--- evas.c      13 Jul 2005 18:10:11 -0000      1.2
***************
*** 29,32 ****
--- 29,33 ----
  Evas_PyObject__clear(Evas_PyObject *self)
  {
+     //printf("Evas CLEAR\n");
      if (self->dict) {
          PyObject *tmp = self->dict;
***************
*** 41,44 ****
--- 42,46 ----
  Evas_PyObject__traverse(Evas_PyObject *self, visitproc visit, void *arg)
  {
+     //printf("Evas traverse\n");
      if (self->dict) {
          int ret = visit(self->dict, arg);
***************
*** 47,50 ****
--- 49,58 ----
  
      }
+     if (self->dependencies) {
+         int ret = visit(self->dependencies, arg);
+         if (ret != 0)
+             return ret;
+     }
+ 
      return 0;
  }
***************
*** 70,73 ****
--- 78,82 ----
      self->evas = evas;
      self->dict = PyDict_New();
+     self->dependencies = PyList_New(0);
      return 0;
  }
***************
*** 75,78 ****
--- 84,88 ----
  static PyMemberDef Evas_PyObject_members[] = {
      {"__dict__", T_OBJECT_EX, offsetof(Evas_PyObject, dict), 0, "Attribute 
dictionary"},
+     {"dependencies", T_OBJECT_EX, offsetof(Evas_PyObject, dependencies), 0, 
"Dependencies"},
      {NULL}
  };
***************
*** 82,89 ****
--- 92,101 ----
  Evas_PyObject__dealloc(Evas_PyObject * self)
  {
+     printf("Evas dealloc\n");
      if (self->evas) {
          evas_free(self->evas);
      }
      Evas_PyObject__clear(self);
+     Py_DECREF(self->dependencies);
      self->ob_type->tp_free((PyObject*)self);
  }
***************
*** 244,247 ****
--- 256,275 ----
  
  PyObject *
+ Evas_PyObject_object_name_find(Evas_PyObject * self, PyObject * args)
+ {
+     char *name;
+     Evas_Object *obj;
+     if (!PyArg_ParseTuple(args, "s", &name))
+         return NULL;
+ 
+     obj = evas_object_name_find(self->evas, name);
+     if (obj)
+         return (PyObject *) wrap_evas_object(obj, self);
+     Py_INCREF(Py_None);
+     return Py_None;
+ }
+ 
+ 
+ PyObject *
  Evas_PyObject_font_path_set(Evas_PyObject * self, PyObject * args)
  {
***************
*** 278,281 ****
--- 306,310 ----
  // *INDENT-OFF*
  PyMethodDef Evas_PyObject_methods[] = {
+     {"object_name_find", (PyCFunction) Evas_PyObject_object_name_find, 
METH_VARARGS},
      {"output_set", (PyCFunction) Evas_PyObject_output_set, METH_VARARGS | 
METH_KEYWORDS},
      {"font_path_set", (PyCFunction) Evas_PyObject_font_path_set, 
METH_VARARGS},



-------------------------------------------------------
This SF.Net email is sponsored by the 'Do More With Dual!' webinar happening
July 14 at 8am PDT/11am EDT. We invite you to explore the latest in dual
core and dual graphics technology at this free one hour event hosted by HP, 
AMD, and NVIDIA.  To register visit http://www.hp.com/go/dualwebinar
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to