Index: gtk/gtk.symbols
===================================================================
--- gtk/gtk.symbols	(revision 18000)
+++ gtk/gtk.symbols	(working copy)
@@ -3054,6 +3054,8 @@ gtk_rc_set_default_files_utf8
 gtk_rc_style_copy
 gtk_rc_style_get_type G_GNUC_CONST
 gtk_rc_style_new
+gtk_rc_style_set_rc_property
+gtk_rc_style_unset_rc_property
 #ifndef GTK_DISABLE_DEPRECATED
 gtk_rc_style_ref
 gtk_rc_style_unref
Index: gtk/gtkrc.c
===================================================================
--- gtk/gtkrc.c	(revision 17999)
+++ gtk/gtkrc.c	(working copy)
@@ -240,6 +240,10 @@ static gint	   gtk_rc_properties_cmp	   
 						      gconstpointer    bsearch_node2);
 static void        gtk_rc_set_free                   (GtkRcSet        *rc_set);
 
+static void	   insert_rc_property		     (GtkRcStyle      *style,
+						      GtkRcProperty   *property,
+						      gboolean         replace);
+
 
 static const GScannerConfig gtk_rc_scanner_config =
 {
@@ -1265,6 +1269,36 @@ gtk_rc_style_copy (GtkRcStyle *orig)
   return style;
 }
 
+void
+gtk_rc_style_set_rc_property (GtkRcStyle *rc_style,
+			      GtkRcProperty *property)
+{
+  g_return_if_fail (GTK_IS_RC_STYLE (rc_style));
+  g_return_if_fail (property != NULL);
+
+  insert_rc_property (rc_style, property, TRUE);
+}
+
+void
+gtk_rc_style_unset_rc_property (GtkRcStyle *rc_style,
+				GQuark      type_name,
+				GQuark      property_name)
+{
+  GtkRcProperty *node;
+
+  g_return_if_fail (GTK_IS_RC_STYLE (rc_style));
+
+  node = _gtk_rc_style_lookup_rc_property (rc_style, type_name, property_name);
+
+  if (node != NULL)
+    {
+      guint index = (GtkRcProperty *) rc_style->rc_properties - node;
+      g_value_unset (&node->value);
+      g_free (node->origin);
+      g_array_remove_index (rc_style->rc_properties, index);
+    }
+}
+
 void      
 gtk_rc_style_ref (GtkRcStyle *rc_style)
 {
Index: gtk/gtkrc.h
===================================================================
--- gtk/gtkrc.h	(revision 17999)
+++ gtk/gtkrc.h	(working copy)
@@ -248,6 +248,11 @@ struct _GtkRcProperty
 const GtkRcProperty* _gtk_rc_style_lookup_rc_property (GtkRcStyle *rc_style,
 						       GQuark      type_name,
 						       GQuark      property_name);
+void	      gtk_rc_style_set_rc_property	      (GtkRcStyle *rc_style,
+						       GtkRcProperty *property);
+void	      gtk_rc_style_unset_rc_property	      (GtkRcStyle *rc_style,
+						       GQuark      type_name,
+						       GQuark      property_name);
 
 GSList     * _gtk_rc_style_get_color_hashes        (GtkRcStyle *rc_style);
 
Index: tests/testgtk.c
===================================================================
--- tests/testgtk.c	(revision 17999)
+++ tests/testgtk.c	(working copy)
@@ -13157,6 +13157,7 @@ create_styles (GtkWidget *widget)
   PangoFontDescription *font_desc;
 
   GtkRcStyle *rc_style;
+  GtkRcProperty rc_property;
 
   if (!window)
     {
@@ -13226,6 +13227,25 @@ create_styles (GtkWidget *widget)
       gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
       gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
 
+      label = gtk_label_new ("Cursor:");
+      gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+      gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+
+      entry = gtk_entry_new ();
+      gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
+      rc_style = gtk_widget_get_modifier_style (entry);
+      memset (&rc_property, 0, sizeof rc_property);
+      rc_property.type_name = g_type_qname (G_OBJECT_TYPE (entry));
+      rc_property.property_name = g_quark_from_string ("cursor-color");
+      g_value_init (&rc_property.value, G_TYPE_STRING);
+      g_value_set_string (&rc_property.value, "red");
+      gtk_rc_style_set_rc_property (rc_style, &rc_property);
+      rc_property.property_name = g_quark_from_string ("secondary-cursor-color");
+      gtk_rc_style_set_rc_property (rc_style, &rc_property);
+      gtk_widget_modify_style (entry, rc_style);
+      g_value_unset (&rc_property.value);
+      gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
+
       label = gtk_label_new ("Multiple:");
       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
       gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
Index: tests/testtext.c
===================================================================
--- tests/testtext.c	(revision 17999)
+++ tests/testtext.c	(working copy)
@@ -984,13 +984,60 @@ do_editable_changed (gpointer callback_d
 }
 
 static void
+change_cursor_color (GtkWidget *widget, 
+		     gboolean   set)
+{
+  GtkRcProperty rc_prop;
+  GtkRcStyle *rc_style;
+
+  rc_style = gtk_widget_get_modifier_style (widget);
+
+  if (set)
+    {
+      memset (&rc_prop, 0, sizeof rc_prop);
+      rc_prop.type_name = g_type_qname (G_OBJECT_TYPE (widget));
+      g_value_init (&rc_prop.value, G_TYPE_STRING);
+      g_value_set_static_string (&rc_prop.value, "green");
+      rc_prop.property_name = g_quark_from_static_string ("cursor-color");
+      gtk_rc_style_set_rc_property (rc_style, &rc_prop);
+      rc_prop.property_name = g_quark_from_static_string ("secondary-cursor-color");
+      gtk_rc_style_set_rc_property (rc_style, &rc_prop);
+      g_value_unset (&rc_prop.value);
+    }
+  else
+    {
+      gtk_rc_style_unset_rc_property (rc_style,
+				      g_type_qname (G_OBJECT_TYPE (widget)),
+				      g_quark_from_static_string ("cursor-color"));
+      gtk_rc_style_unset_rc_property (rc_style,
+				      g_type_qname (G_OBJECT_TYPE (widget)),
+				      g_quark_from_static_string ("secondary-cursor-color"));
+    }
+
+  gtk_widget_modify_style (widget, rc_style);
+}
+
+static void
 do_cursor_visible_changed (gpointer callback_data,
                            guint callback_action,
                            GtkWidget *widget)
 {
   View *view = view_from_widget (widget);
 
-  gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view->text_view), callback_action);
+  switch (callback_action)
+    {
+    case 0:
+      gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view->text_view), FALSE);
+      break;
+    case 1:
+      gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view->text_view), TRUE);
+      change_cursor_color (view->text_view, FALSE);
+      break;
+    case 2:
+      gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view->text_view), TRUE);
+      change_cursor_color (view->text_view, TRUE);
+      break;
+    }
 }
 
 static void
@@ -1946,8 +1993,9 @@ static GtkItemFactoryEntry menu_items[] 
   { "/Settings/Not editable",    NULL,      do_editable_changed,  FALSE, "/Settings/Editable" },
   { "/Settings/sep1",        NULL,      NULL,             0, "<Separator>" },
 
-  { "/Settings/Cursor visible",    NULL,      do_cursor_visible_changed,  TRUE, "<RadioItem>" },
-  { "/Settings/Cursor not visible", NULL,      do_cursor_visible_changed,  FALSE, "/Settings/Cursor visible" },
+  { "/Settings/Cursor normal",    NULL,      do_cursor_visible_changed,  1, "<RadioItem>" },
+  { "/Settings/Cursor not visible", NULL,      do_cursor_visible_changed,  0, "/Settings/Cursor normal" },
+  { "/Settings/Cursor colored", NULL,      do_cursor_visible_changed,  2, "/Settings/Cursor normal" },
   { "/Settings/sep1",        NULL,      NULL,          0, "<Separator>" },
   
   { "/Settings/Left-to-Right", NULL,    do_direction_changed,  GTK_TEXT_DIR_LTR, "<RadioItem>" },
