Index: gtk/gdkcolor.override
===================================================================
--- gtk/gdkcolor.override	(revision 2965)
+++ gtk/gdkcolor.override	(working copy)
@@ -168,6 +168,37 @@
     return _wrap_gdk_colormap_alloc_color(self, args, kwargs);
 }
 %%
+override-slot GdkColor.tp_richcompare
+static PyObject *
+_wrap_gdk_color_tp_richcompare(PyObject *self, PyObject *other, int op)
+{
+    PyObject *result;
+
+    if (PyObject_TypeCheck(self, &PyGdkColor_Type)
+        && PyObject_TypeCheck(other, &PyGdkColor_Type)) {
+        GdkColor *color1 = pyg_boxed_get(self, GdkColor);
+        GdkColor *color2 = pyg_boxed_get(other, GdkColor);
+
+        switch (op) {
+        case Py_EQ:
+            result = (gdk_color_equal(color1, color2)
+                      ? Py_True : Py_False);
+            break;
+        case Py_NE:
+            result = (!gdk_color_equal(color1, color2)
+                      ? Py_True : Py_False);
+            break;
+        default:
+            result = Py_NotImplemented;
+        }
+    }
+    else
+        result = Py_NotImplemented;
+
+    Py_INCREF(result);
+    return result;
+}
+%%
 override gdk_colormap_query_color kwargs
 static PyObject *
 _wrap_gdk_colormap_query_color(PyGObject *self, PyObject *args,
Index: gtk/gdk.override
===================================================================
--- gtk/gdk.override	(revision 2965)
+++ gtk/gdk.override	(working copy)
@@ -513,6 +513,37 @@
     return pyg_boxed_new(GDK_TYPE_RECTANGLE, &rect, TRUE, TRUE);
 }
 %%
+override-slot GdkRegion.tp_richcompare
+static PyObject *
+_wrap_pygdk_region_tp_richcompare(PyObject *self, PyObject *other, int op)
+{
+    PyObject *result;
+
+    if (PyObject_TypeCheck(self, &PyGdkRegion_Type)
+        && PyObject_TypeCheck(other, &PyGdkRegion_Type)) {
+        GdkRegion *region1 = pyg_boxed_get(self, GdkRegion);
+        GdkRegion *region2 = pyg_boxed_get(other, GdkRegion);
+
+        switch (op) {
+        case Py_EQ:
+            result = (gdk_region_equal(region1, region2)
+                      ? Py_True : Py_False);
+            break;
+        case Py_NE:
+            result = (!gdk_region_equal(region1, region2)
+                      ? Py_True : Py_False);
+            break;
+        default:
+            result = Py_NotImplemented;
+        }
+    }
+    else
+        result = Py_NotImplemented;
+
+    Py_INCREF(result);
+    return result;
+}
+%%
 override-attr GdkDevice.axes
 static PyObject *
 _wrap_gdk_device__get_axes(PyGObject *self, void *closure)
Index: gtk/gdkrectangle.override
===================================================================
--- gtk/gdkrectangle.override	(revision 2965)
+++ gtk/gdkrectangle.override	(working copy)
@@ -214,3 +214,36 @@
                             
     return pyg_boxed_new(GDK_TYPE_RECTANGLE, &dest, TRUE, TRUE);
 }
+%%
+override-slot GdkRectangle.tp_richcompare
+static PyObject *
+_wrap_gdk_rectangle_tp_richcompare(PyObject *self, PyObject *other, int op)
+{
+    PyObject *result;
+
+    if (PyObject_TypeCheck(self, &PyGdkRectangle_Type)
+        && PyObject_TypeCheck(other, &PyGdkRectangle_Type)) {
+        GdkRectangle *rect1 = pyg_boxed_get(self, GdkRectangle);
+        GdkRectangle *rect2 = pyg_boxed_get(other, GdkRectangle);
+
+        switch (op) {
+        case Py_EQ:
+            result = (rect1->x == rect2->x && rect1->y == rect2->y
+                      && rect1->width == rect2->width && rect1->height == rect2->height
+                      ? Py_True : Py_False);
+            break;
+        case Py_NE:
+            result = (rect1->x != rect2->x || rect1->y != rect2->y
+                      || rect1->width != rect2->width || rect1->height != rect2->height
+                      ? Py_True : Py_False);
+            break;
+        default:
+            result = Py_NotImplemented;
+        }
+    }
+    else
+        result = Py_NotImplemented;
+
+    Py_INCREF(result);
+    return result;
+}
