[pygtk] Make gtk.gdk.Event.time accept 'long' in assignments



commit d62ef2077277f32f0c88bdde92cc48a0efaa38a6
Author: Paul Pogonyshev <pogonyshev gmx net>
Date:   Fri May 8 21:06:54 2009 +0300

    Make gtk.gdk.Event.time accept 'long' in assignments
    
    Fixes bug #408658.
---
 gtk/gdkevent.override  |   46 ++++++++++++++++++++++++++--------------------
 tests/test_gdkevent.py |    9 +++++++++
 2 files changed, 35 insertions(+), 20 deletions(-)

diff --git a/gtk/gdkevent.override b/gtk/gdkevent.override
index 12ae0c1..51c7423 100644
--- a/gtk/gdkevent.override
+++ b/gtk/gdkevent.override
@@ -26,6 +26,11 @@ override-slot GdkEvent.tp_setattr
 		PyErr_Format(PyExc_TypeError, "%s must be an int", attr); \
 		return -1; \
 	    } 
+#define INT_OR_LONG_CHECK() \
+	    if (!PyInt_Check(value) && !PyLong_Check(value)) { \
+		PyErr_Format(PyExc_TypeError, "%s must be an int or a long", attr); \
+		return -1; \
+	    }
 #define FLOAT_CHECK() \
 	    if (!PyFloat_Check(value)) { \
 		PyErr_Format(PyExc_TypeError, "%s must be a float", attr); \
@@ -84,8 +89,8 @@ _wrap_gdk_event_tp_setattr(PyObject *self, char *attr, PyObject *value)
         break;
     case GDK_MOTION_NOTIFY:     /*GdkEventMotion            motion*/
 	if (!strcmp(attr, "time")) {
-	    INT_CHECK();
-	    event->motion.time = PyInt_AsLong(value);
+	    INT_OR_LONG_CHECK();
+	    event->motion.time = PyInt_AsUnsignedLongMask(value);
 	    return 0;
 	} else if (attr[0] == 'x' && attr[1] == '\0') {
 	    FLOAT_CHECK();
@@ -124,8 +129,8 @@ _wrap_gdk_event_tp_setattr(PyObject *self, char *attr, PyObject *value)
     case GDK_3BUTTON_PRESS:     /*GdkEventButton            button*/
     case GDK_BUTTON_RELEASE:    /*GdkEventButton            button*/
 	if (!strcmp(attr, "time")) {
-	    INT_CHECK();
-	    event->button.time = PyInt_AsLong(value);
+	    INT_OR_LONG_CHECK();
+	    event->button.time = PyInt_AsUnsignedLongMask(value);
 	    return 0;
 	} else if (attr[0] == 'x' && attr[1] == '\0') {
 	    FLOAT_CHECK();
@@ -162,8 +167,8 @@ _wrap_gdk_event_tp_setattr(PyObject *self, char *attr, PyObject *value)
     case GDK_KEY_PRESS:         /*GdkEventKey               key*/
     case GDK_KEY_RELEASE:       /*GdkEventKey               key*/
 	if (!strcmp(attr, "time")) {
-	    INT_CHECK();
-	    event->key.time = PyInt_AsLong(value);
+	    INT_OR_LONG_CHECK();
+	    event->key.time = PyInt_AsUnsignedLongMask(value);
 	    return 0;
 	} else if (!strcmp(attr, "state")) {
 	    INT_CHECK();
@@ -204,8 +209,8 @@ _wrap_gdk_event_tp_setattr(PyObject *self, char *attr, PyObject *value)
           event->crossing.subwindow = g_object_ref(GDK_WINDOW(((PyGObject*)value)->obj));
           return 0;
 	} else if (!strcmp(attr, "time")) {
-	    INT_CHECK();
-	    event->crossing.time = PyInt_AsLong(value);
+	    INT_OR_LONG_CHECK();
+	    event->crossing.time = PyInt_AsUnsignedLongMask(value);
 	    return 0;
 	} else if (attr[0] == 'x' && attr[1] == '\0') {
 	    FLOAT_CHECK();
@@ -273,8 +278,8 @@ _wrap_gdk_event_tp_setattr(PyObject *self, char *attr, PyObject *value)
 	    PyErr_SetString(PyExc_TypeError, "atom is not writable");
 	    return -1;
 	} else if (!strcmp(attr, "time")) {
-	    INT_CHECK();
-	    event->property.time = PyInt_AsLong(value);
+	    INT_OR_LONG_CHECK();
+	    event->property.time = PyInt_AsUnsignedLongMask(value);
 	    return 0;
 	} else if (!strcmp(attr, "state")) {
 	    INT_CHECK();
@@ -299,8 +304,8 @@ _wrap_gdk_event_tp_setattr(PyObject *self, char *attr, PyObject *value)
 	    event->selection.requestor = PyInt_AsLong(value);
 	    return 0;
 	} else if (!strcmp(attr, "time")) {
-	    INT_CHECK();
-	    event->selection.time = PyInt_AsLong(value);
+	    INT_OR_LONG_CHECK();
+	    event->selection.time = PyInt_AsUnsignedLongMask(value);
 	    return 0;
 	}
 	
@@ -308,8 +313,8 @@ _wrap_gdk_event_tp_setattr(PyObject *self, char *attr, PyObject *value)
     case GDK_PROXIMITY_IN:      /*GdkEventProximity         proximity*/
     case GDK_PROXIMITY_OUT:     /*GdkEventProximity         proximity*/
 	if (!strcmp(attr, "time")) {
-	    INT_CHECK();
-	    event->proximity.time = PyInt_AsLong(value);
+	    INT_OR_LONG_CHECK();
+	    event->proximity.time = PyInt_AsUnsignedLongMask(value);
 	    return 0;
 	} else if (!strcmp(attr, "device")) {
 	    PyErr_SetString(PyExc_TypeError, "device is not writable");
@@ -326,8 +331,8 @@ _wrap_gdk_event_tp_setattr(PyObject *self, char *attr, PyObject *value)
 	    PyErr_SetString(PyExc_TypeError, "context is not writable");
 	    return -1;
 	} else if (!strcmp(attr, "time")) {
-	    INT_CHECK();
-	    event->dnd.time = PyInt_AsLong(value);
+	    INT_OR_LONG_CHECK();
+	    event->dnd.time = PyInt_AsUnsignedLongMask(value);
 	    return 0;
 	} else if (!strcmp(attr, "x_root")) {
 	    FLOAT_CHECK();
@@ -370,8 +375,8 @@ _wrap_gdk_event_tp_setattr(PyObject *self, char *attr, PyObject *value)
         break;
     case GDK_SCROLL:            /*GdkEventScroll            scroll*/
 	if (!strcmp(attr, "time")) {
-	    INT_CHECK();
-	    event->scroll.time = PyInt_AsLong(value);
+	    INT_OR_LONG_CHECK();
+	    event->scroll.time = PyInt_AsUnsignedLongMask(value);
 	    return 0;
 	} else if (attr[0] == 'x' && attr[1] == '\0') {
 	    FLOAT_CHECK();
@@ -435,8 +440,8 @@ _wrap_gdk_event_tp_setattr(PyObject *self, char *attr, PyObject *value)
 	    PyErr_SetString(PyExc_TypeError, "selection is not writable");
 	    return -1;
 	} else if (!strcmp(attr, "time")) {
-	    INT_CHECK();
-	    event->owner_change.time = PyInt_AsLong(value);
+	    INT_OR_LONG_CHECK();
+	    event->owner_change.time = PyInt_AsUnsignedLongMask(value);
 	} else if (!strcmp(attr, "selection_time")) {
 	    INT_CHECK();
 	    event->owner_change.selection_time = PyInt_AsLong(value);
@@ -462,6 +467,7 @@ _wrap_gdk_event_tp_setattr(PyObject *self, char *attr, PyObject *value)
     return -1;
 }
 #undef INT_CHECK
+#undef INT_OR_LONG_CHECK
 #undef FLOAT_CHECK
 #undef STRING_CHECK	
 %%
diff --git a/tests/test_gdkevent.py b/tests/test_gdkevent.py
index 1721a9e..741e8ab 100644
--- a/tests/test_gdkevent.py
+++ b/tests/test_gdkevent.py
@@ -18,5 +18,14 @@ class TestGdkEvent(unittest.TestCase):
         event.window = win2.window
         self.assertEqual(event.window, win2.window)
 
+    # Bug #408658.
+    def testEventTime(self):
+        event = gtk.gdk.Event(gtk.gdk.MOTION_NOTIFY)
+        event.time = 0x80000000
+
+        # According to GTK+ source files, 'time' field is always of
+        # 'guint32' type, so we must always have overflow here.
+        self.assert_(event.time == -0x80000000)
+
 if __name__ == '__main__':
     unittest.main()



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]