[Pkg-e-commits] [SCM] Python bindings for Evas branch, upstream-vcs, updated. a2d7e40fb9fbbe948f479174a461f735a2f530fb

cmarcelo cmarcelo at alioth.debian.org
Sat May 24 16:31:55 UTC 2008


The following commit has been merged in the upstream-vcs branch:
commit 05bdbeb90268f3e683bedf86a39096d322f479d5
Author: cmarcelo <cmarcelo>
Date:   Wed Mar 26 04:41:15 2008 +0000

    Add protection code for event objects, avoiding invalid references.
    
    Event objects are meant to be used only inside the callbacks, so any access
    after the callback returns will be considered invalid and raise a ValueError.
    
    The first idea (reverted by previous patch) was to make these objects without
    any reference to original event (copying data), so they couldn't cause trouble.
    But now we will have event_flags field, which is writeable by the callbacks,
    so it's better just keep the reference and invalidate the object as we do.

diff --git a/evas/evas.c_evas_object.pxi b/evas/evas.c_evas_object.pxi
index c9567a0..785d087 100644
--- a/evas/evas.c_evas_object.pxi
+++ b/evas/evas.c_evas_object.pxi
@@ -869,6 +869,9 @@ cdef public class Object [object PyEvasObject, type PyEvasObject_Type]:
                C{EVAS_CALLBACK_MOUSE_*}, C{EVAS_CALLBACK_KEY_*}, while the
                second is used by events without. Parameters given at the
                end of C{event_callback_add()} will be given to the callback.
+               Note that the object passed to the callback in B{event}
+               parameter will only be valid during the callback, using it
+               after callback returns will raise an ValueError.
 
         @raise ValueError: if B{type} is unknown.
         @raise TypeError: if B{func} is not callable.
diff --git a/evas/evas.c_evas_object_callbacks.pxi b/evas/evas.c_evas_object_callbacks.pxi
index cb4c9a5..8521185 100644
--- a/evas/evas.c_evas_object_callbacks.pxi
+++ b/evas/evas.c_evas_object_callbacks.pxi
@@ -30,6 +30,7 @@ cdef void cb_mouse_in(void *data, Evas *e,
     event = EventMouseIn()
     event._set_obj(e_inf)
     cb_dispatcher(<Object>data, event, EVAS_CALLBACK_MOUSE_IN)
+    event._unset_obj()
 
 
 cdef void cb_mouse_out(void *data, Evas *e,
@@ -38,6 +39,7 @@ cdef void cb_mouse_out(void *data, Evas *e,
     event = EventMouseOut()
     event._set_obj(e_inf)
     cb_dispatcher(<Object>data, event, EVAS_CALLBACK_MOUSE_OUT)
+    event._unset_obj()
 
 
 cdef void cb_mouse_down(void *data, Evas *e,
@@ -46,6 +48,7 @@ cdef void cb_mouse_down(void *data, Evas *e,
     event = EventMouseDown()
     event._set_obj(e_inf)
     cb_dispatcher(<Object>data, event, EVAS_CALLBACK_MOUSE_DOWN)
+    event._unset_obj()
 
 
 cdef void cb_mouse_up(void *data, Evas *e,
@@ -54,6 +57,7 @@ cdef void cb_mouse_up(void *data, Evas *e,
     event = EventMouseUp()
     event._set_obj(e_inf)
     cb_dispatcher(<Object>data, event, EVAS_CALLBACK_MOUSE_UP)
+    event._unset_obj()
 
 
 cdef void cb_mouse_move(void *data, Evas *e,
@@ -62,6 +66,7 @@ cdef void cb_mouse_move(void *data, Evas *e,
     event = EventMouseMove()
     event._set_obj(e_inf)
     cb_dispatcher(<Object>data, event, EVAS_CALLBACK_MOUSE_MOVE)
+    event._unset_obj()
 
 
 cdef void cb_mouse_wheel(void *data, Evas *e,
@@ -70,6 +75,7 @@ cdef void cb_mouse_wheel(void *data, Evas *e,
     event = EventMouseWheel()
     event._set_obj(e_inf)
     cb_dispatcher(<Object>data, event, EVAS_CALLBACK_MOUSE_WHEEL)
+    event._unset_obj()
 
 
 cdef void cb_free(void *data, Evas *e,
@@ -83,6 +89,7 @@ cdef void cb_key_down(void *data, Evas *e,
     event = EventKeyDown()
     event._set_obj(e_inf)
     cb_dispatcher(<Object>data, event, EVAS_CALLBACK_KEY_DOWN)
+    event._unset_obj()
 
 
 cdef void cb_key_up(void *data, Evas *e,
@@ -91,6 +98,7 @@ cdef void cb_key_up(void *data, Evas *e,
     event = EventKeyUp()
     event._set_obj(e_inf)
     cb_dispatcher(<Object>data, event, EVAS_CALLBACK_KEY_UP)
+    event._unset_obj()
 
 
 cdef void cb_focus_in(void *data, Evas *e,
diff --git a/evas/evas.c_evas_object_events.pxi b/evas/evas.c_evas_object_events.pxi
index 017e234..3eb67f3 100644
--- a/evas/evas.c_evas_object_events.pxi
+++ b/evas/evas.c_evas_object_events.pxi
@@ -4,25 +4,38 @@ cdef class EventPoint:
     cdef void _set_obj(self, Evas_Point *obj):
         self.obj = obj
 
+    cdef void _unset_obj(self):
+        self.obj = NULL
+
     def __str__(self):
+        self._check_validity()
         return "%s(%d, %d)" % (self.__class__.__name__, self.obj.x, self.obj.y)
 
+    cdef void _check_validity(self) except *:
+        if self.obj == NULL:
+            raise ValueError("EventPoint object is invalid.")
+
     property x:
         def __get__(self):
+            self._check_validity()
             return self.obj.x
 
     property y:
         def __get__(self):
+            self._check_validity()
             return self.obj.y
 
     property xy:
         def __get__(self):
+            self._check_validity()
             return (self.obj.x, self.obj.y)
 
     def __len__(self):
+        self._check_validity()
         return 2
 
     def __getitem__(self, int index):
+        self._check_validity()
         if index == 0:
             return self.obj.x
         elif index == 1:
@@ -39,6 +52,10 @@ cdef class EventPosition:
         self.canvas = EventPoint()
         self.canvas._set_obj(<Evas_Point*>canvas)
 
+    cdef void _unset_objs(self):
+        self.output._unset_obj()
+        self.canvas._unset_obj()
+
     def __str__(self):
         return "%s(output=(%d, %d), canvas=(%d, %d))" % \
                (self.__class__.__name__, self.output.x, self.output.y,
@@ -52,7 +69,16 @@ cdef class EventMouseIn:
         self.position = EventPosition()
         self.position._set_objs(&self.obj.output, &self.obj.canvas)
 
+    cdef void _unset_obj(self):
+        self.obj = NULL
+        self.position._unset_objs()
+
+    cdef void _check_validity(self) except *:
+        if self.obj == NULL:
+            raise ValueError("EventMouseIn object is invalid.")
+
     def __str__(self):
+        self._check_validity()
         return ("%s(buttons=%d, output=(%d, %d), canvas=(%d, %d), "
                 "timestamp=%d)") % \
                 (self.__class__.__name__, self.obj.buttons,
@@ -62,10 +88,12 @@ cdef class EventMouseIn:
 
     property buttons:
         def __get__(self):
+            self._check_validity()
             return self.obj.buttons
 
     property timestamp:
         def __get__(self):
+            self._check_validity()
             return self.obj.timestamp
 
 
@@ -75,7 +103,16 @@ cdef class EventMouseOut:
         self.position = EventPosition()
         self.position._set_objs(&self.obj.output, &self.obj.canvas)
 
+    cdef void _unset_obj(self):
+        self.obj = NULL
+        self.position._unset_objs()
+
+    cdef void _check_validity(self) except *:
+        if self.obj == NULL:
+            raise ValueError("EventMouseOut object is invalid.")
+
     def __str__(self):
+        self._check_validity()
         return ("%s(buttons=%d, output=(%d, %d), canvas=(%d, %d), "
                 "timestamp=%d)") % \
                 (self.__class__.__name__, self.obj.buttons,
@@ -85,10 +122,12 @@ cdef class EventMouseOut:
 
     property buttons:
         def __get__(self):
+            self._check_validity()
             return self.obj.buttons
 
     property timestamp:
         def __get__(self):
+            self._check_validity()
             return self.obj.timestamp
 
 
@@ -98,7 +137,16 @@ cdef class EventMouseDown:
         self.position = EventPosition()
         self.position._set_objs(&self.obj.output, &self.obj.canvas)
 
+    cdef void _unset_obj(self):
+        self.obj = NULL
+        self.position._unset_objs()
+
+    cdef void _check_validity(self) except *:
+        if self.obj == NULL:
+            raise ValueError("EventMouseDown object is invalid.")
+
     def __str__(self):
+        self._check_validity()
         return ("%s(button=%d, output=(%d, %d), canvas=(%d, %d), "
                 "timestamp=%d)") % \
                 (self.__class__.__name__, self.obj.button,
@@ -108,10 +156,12 @@ cdef class EventMouseDown:
 
     property button:
         def __get__(self):
+            self._check_validity()
             return self.obj.button
 
     property timestamp:
         def __get__(self):
+            self._check_validity()
             return self.obj.timestamp
 
 
@@ -121,7 +171,16 @@ cdef class EventMouseUp:
         self.position = EventPosition()
         self.position._set_objs(&self.obj.output, &self.obj.canvas)
 
+    cdef void _unset_obj(self):
+        self.obj = NULL
+        self.position._unset_objs()
+
+    cdef void _check_validity(self) except *:
+        if self.obj == NULL:
+            raise ValueError("EventMouseUp object is invalid.")
+
     def __str__(self):
+        self._check_validity()
         return ("%s(button=%d, output=(%d, %d), canvas=(%d, %d), "
                 "timestamp=%d)") % \
                 (self.__class__.__name__, self.obj.button,
@@ -131,10 +190,12 @@ cdef class EventMouseUp:
 
     property button:
         def __get__(self):
+            self._check_validity()
             return self.obj.button
 
     property timestamp:
         def __get__(self):
+            self._check_validity()
             return self.obj.timestamp
 
 
@@ -147,7 +208,17 @@ cdef class EventMouseMove:
         self.prev_position._set_objs(&self.obj.prev.output,
                                      &self.obj.prev.canvas)
 
+    cdef void _unset_obj(self):
+        self.obj = NULL
+        self.position._unset_objs()
+        self.prev_position._unset_objs()
+
+    cdef void _check_validity(self) except *:
+        if self.obj == NULL:
+            raise ValueError("EventMouseMove object is invalid.")
+
     def __str__(self):
+        self._check_validity()
         return ("%s(buttons=%d, output=(%d, %d), canvas=(%d, %d), "
                 "prev_output=(%d, %d), prev_canvas=(%d, %d), timestamp=%d)") %\
                 (self.__class__.__name__, self.obj.buttons,
@@ -159,10 +230,12 @@ cdef class EventMouseMove:
 
     property buttons:
         def __get__(self):
+            self._check_validity()
             return self.obj.buttons
 
     property timestamp:
         def __get__(self):
+            self._check_validity()
             return self.obj.timestamp
 
 
@@ -172,7 +245,16 @@ cdef class EventMouseWheel:
         self.position = EventPosition()
         self.position._set_objs(&self.obj.output, &self.obj.canvas)
 
+    cdef void _unset_obj(self):
+        self.obj = NULL
+        self.position._unset_objs()
+
+    cdef void _check_validity(self) except *:
+        if self.obj == NULL:
+            raise ValueError("EventMouseWheel object is invalid.")
+
     def __str__(self):
+        self._check_validity()
         return ("%s(direction=%d, z=%d, output=(%d, %d), "
                 "canvas=(%d, %d), timestamp=%d)") % \
                 (self.__class__.__name__, self.obj.direction, self.obj.z,
@@ -182,14 +264,17 @@ cdef class EventMouseWheel:
 
     property timestamp:
         def __get__(self):
+            self._check_validity()
             return self.obj.timestamp
 
     property direction:
         def __get__(self):
+            self._check_validity()
             return self.obj.direction
 
     property z:
         def __get__(self):
+            self._check_validity()
             return self.obj.z
 
 
@@ -197,7 +282,15 @@ cdef class EventKeyDown:
     cdef void _set_obj(self, void *ptr):
         self.obj = <Evas_Event_Key_Down*>ptr
 
+    cdef void _unset_obj(self):
+        self.obj = NULL
+
+    cdef void _check_validity(self) except *:
+        if self.obj == NULL:
+            raise ValueError("EventKeyDown object is invalid.")
+
     def __str__(self):
+        self._check_validity()
         return ("%s(keyname=%r, key=%r, string=%r, compose=%r, "
                 "timestamp=%d)") % \
                 (self.__class__.__name__, self.keyname,
@@ -206,6 +299,7 @@ cdef class EventKeyDown:
 
     property keyname:
         def __get__(self):
+            self._check_validity()
             if self.obj.keyname == NULL:
                 return None
             else:
@@ -213,6 +307,7 @@ cdef class EventKeyDown:
 
     property key:
         def __get__(self):
+            self._check_validity()
             if self.obj.key == NULL:
                 return None
             else:
@@ -220,6 +315,7 @@ cdef class EventKeyDown:
 
     property string:
         def __get__(self):
+            self._check_validity()
             if self.obj.string == NULL:
                 return None
             else:
@@ -227,6 +323,7 @@ cdef class EventKeyDown:
 
     property compose:
         def __get__(self):
+            self._check_validity()
             if self.obj.compose == NULL:
                 return None
             else:
@@ -234,6 +331,7 @@ cdef class EventKeyDown:
 
     property timestamp:
         def __get__(self):
+            self._check_validity()
             return self.obj.timestamp
 
 
@@ -241,7 +339,15 @@ cdef class EventKeyUp:
     cdef void _set_obj(self, void *ptr):
         self.obj = <Evas_Event_Key_Up*>ptr
 
+    cdef void _unset_obj(self):
+        self.obj = NULL
+
+    cdef void _check_validity(self) except *:
+        if self.obj == NULL:
+            raise ValueError("EventKeyUp object is invalid.")
+
     def __str__(self):
+        self._check_validity()
         return ("%s(keyname=%r, key=%r, string=%r, compose=%r, "
                 "timestamp=%d)") % \
                 (self.__class__.__name__, self.keyname,
@@ -250,6 +356,7 @@ cdef class EventKeyUp:
 
     property keyname:
         def __get__(self):
+            self._check_validity()
             if self.obj.keyname == NULL:
                 return None
             else:
@@ -257,6 +364,7 @@ cdef class EventKeyUp:
 
     property key:
         def __get__(self):
+            self._check_validity()
             if self.obj.key == NULL:
                 return None
             else:
@@ -264,6 +372,7 @@ cdef class EventKeyUp:
 
     property string:
         def __get__(self):
+            self._check_validity()
             if self.obj.string == NULL:
                 return None
             else:
@@ -271,6 +380,7 @@ cdef class EventKeyUp:
 
     property compose:
         def __get__(self):
+            self._check_validity()
             if self.obj.compose == NULL:
                 return None
             else:
@@ -278,5 +388,6 @@ cdef class EventKeyUp:
 
     property timestamp:
         def __get__(self):
+            self._check_validity()
             return self.obj.timestamp
 
diff --git a/include/evas/c_evas.pxd b/include/evas/c_evas.pxd
index 5a3c08d..72be306 100644
--- a/include/evas/c_evas.pxd
+++ b/include/evas/c_evas.pxd
@@ -551,6 +551,8 @@ cdef class EventPoint:
     cdef Evas_Point *obj
 
     cdef void _set_obj(self, Evas_Point *obj)
+    cdef void _unset_obj(self)
+    cdef void _check_validity(self) except *
 
 
 cdef class EventPosition:
@@ -558,6 +560,7 @@ cdef class EventPosition:
     cdef readonly EventPoint canvas
 
     cdef void _set_objs(self, void *output, void *canvas)
+    cdef void _unset_objs(self)
 
 
 cdef class EventMouseIn:
@@ -565,6 +568,8 @@ cdef class EventMouseIn:
     cdef readonly EventPosition position
 
     cdef void _set_obj(self, void *ptr)
+    cdef void _unset_obj(self)
+    cdef void _check_validity(self) except *
 
 
 cdef class EventMouseOut:
@@ -572,6 +577,8 @@ cdef class EventMouseOut:
     cdef readonly EventPosition position
 
     cdef void _set_obj(self, void *ptr)
+    cdef void _unset_obj(self)
+    cdef void _check_validity(self) except *
 
 
 cdef class EventMouseDown:
@@ -579,6 +586,8 @@ cdef class EventMouseDown:
     cdef readonly EventPosition position
 
     cdef void _set_obj(self, void *ptr)
+    cdef void _unset_obj(self)
+    cdef void _check_validity(self) except *
 
 
 cdef class EventMouseUp:
@@ -586,6 +595,8 @@ cdef class EventMouseUp:
     cdef readonly EventPosition position
 
     cdef void _set_obj(self, void *ptr)
+    cdef void _unset_obj(self)
+    cdef void _check_validity(self) except *
 
 
 cdef class EventMouseMove:
@@ -594,6 +605,8 @@ cdef class EventMouseMove:
     cdef readonly EventPosition prev_position
 
     cdef void _set_obj(self, void *ptr)
+    cdef void _unset_obj(self)
+    cdef void _check_validity(self) except *
 
 
 cdef class EventMouseWheel:
@@ -601,18 +614,24 @@ cdef class EventMouseWheel:
     cdef readonly EventPosition position
 
     cdef void _set_obj(self, void *ptr)
+    cdef void _unset_obj(self)
+    cdef void _check_validity(self) except *
 
 
 cdef class EventKeyDown:
     cdef Evas_Event_Key_Down *obj
 
     cdef void _set_obj(self, void *ptr)
+    cdef void _unset_obj(self)
+    cdef void _check_validity(self) except *
 
 
 cdef class EventKeyUp:
     cdef Evas_Event_Key_Up *obj
 
     cdef void _set_obj(self, void *ptr)
+    cdef void _unset_obj(self)
+    cdef void _check_validity(self) except *
 
 
 cdef public class Canvas [object PyEvasCanvas, type PyEvasCanvas_Type]:

-- 
Python bindings for Evas



More information about the Pkg-e-commits mailing list