Index: gtk+-2.10.2/gtk/gtkentry.c
===================================================================
--- gtk+-2.10.2.orig/gtk/gtkentry.c
+++ gtk+-2.10.2/gtk/gtkentry.c
@@ -5189,9 +5189,10 @@ gtk_entry_drag_data_delete (GtkWidget   
  *  - the widget has focus
  */
 
-#define CURSOR_ON_MULTIPLIER 0.66
-#define CURSOR_OFF_MULTIPLIER 0.34
-#define CURSOR_PEND_MULTIPLIER 1.0
+#define CURSOR_ON_MULTIPLIER 2
+#define CURSOR_OFF_MULTIPLIER 1
+#define CURSOR_PEND_MULTIPLIER 3
+#define CURSOR_DIVIDER 3
 
 static gboolean
 cursor_blinks (GtkEntry *entry)
@@ -5221,6 +5222,17 @@ get_cursor_time (GtkEntry *entry)
   return time;
 }
 
+static gint
+get_cursor_blink_timeout (GtkEntry *entry)
+{
+  GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (entry));
+  gint time;
+
+  g_object_get (settings, "gtk-cursor-blink-timeout", &time, NULL);
+
+  return time;
+}
+
 static void
 show_cursor (GtkEntry *entry)
 {
@@ -5267,17 +5279,22 @@ blink_cb (gpointer data)
   g_assert (GTK_WIDGET_HAS_FOCUS (entry));
   g_assert (entry->selection_bound == entry->current_pos);
 
-  if (entry->cursor_visible)
+  if (entry->cursor_time > 1000 * get_cursor_blink_timeout (entry) ) {
+      /* we've blinked enough without the user doing anything, stop blinking */
+      show_cursor (entry);
+      entry->blink_timeout = 0;
+  } else if (entry->cursor_visible)
     {
       hide_cursor (entry);
-      entry->blink_timeout = g_timeout_add (get_cursor_time (entry) * CURSOR_OFF_MULTIPLIER,
+      entry->blink_timeout = g_timeout_add (get_cursor_time (entry) * CURSOR_OFF_MULTIPLIER / CURSOR_DIVIDER,
 					    blink_cb,
 					    entry);
     }
   else
     {
       show_cursor (entry);
-      entry->blink_timeout = g_timeout_add (get_cursor_time (entry) * CURSOR_ON_MULTIPLIER,
+      entry->cursor_time += get_cursor_time (entry);
+      entry->blink_timeout = g_timeout_add (get_cursor_time (entry) * CURSOR_ON_MULTIPLIER / CURSOR_DIVIDER,
 					    blink_cb,
 					    entry);
     }
@@ -5295,10 +5312,10 @@ gtk_entry_check_cursor_blink (GtkEntry *
     {
       if (!entry->blink_timeout)
 	{
-	  entry->blink_timeout = g_timeout_add (get_cursor_time (entry) * CURSOR_ON_MULTIPLIER,
+	  show_cursor (entry);
+	  entry->blink_timeout = g_timeout_add (get_cursor_time (entry) * CURSOR_ON_MULTIPLIER / CURSOR_DIVIDER,
 						blink_cb,
 						entry);
-	  show_cursor (entry);
 	}
     }
   else
@@ -5317,12 +5334,13 @@ gtk_entry_check_cursor_blink (GtkEntry *
 static void
 gtk_entry_pend_cursor_blink (GtkEntry *entry)
 {
+  entry->cursor_time = 0;
   if (cursor_blinks (entry))
     {
       if (entry->blink_timeout != 0)
 	g_source_remove (entry->blink_timeout);
       
-      entry->blink_timeout = g_timeout_add (get_cursor_time (entry) * CURSOR_PEND_MULTIPLIER,
+      entry->blink_timeout = g_timeout_add (get_cursor_time (entry) * CURSOR_PEND_MULTIPLIER / CURSOR_DIVIDER,
 					    blink_cb,
 					    entry);
       show_cursor (entry);
Index: gtk+-2.10.2/gtk/gtkentry.h
===================================================================
--- gtk+-2.10.2.orig/gtk/gtkentry.h
+++ gtk+-2.10.2/gtk/gtkentry.h
@@ -107,6 +107,7 @@ struct _GtkEntry
   gunichar invisible_char;
 
   gint width_chars;
+  guint   cursor_time;  /* time in msec the cursor has blinked since last user event */
 };
 
 struct _GtkEntryClass
Index: gtk+-2.10.2/gtk/gtksettings.c
===================================================================
--- gtk+-2.10.2.orig/gtk/gtksettings.c
+++ gtk+-2.10.2/gtk/gtksettings.c
@@ -64,6 +64,7 @@ enum {
   PROP_DOUBLE_CLICK_DISTANCE,
   PROP_CURSOR_BLINK,
   PROP_CURSOR_BLINK_TIME,
+  PROP_CURSOR_BLINK_TIMEOUT,
   PROP_SPLIT_CURSOR,
   PROP_THEME_NAME,
   PROP_ICON_THEME_NAME,
@@ -218,6 +219,14 @@ gtk_settings_class_init (GtkSettingsClas
                                              NULL);
   g_assert (result == PROP_CURSOR_BLINK_TIME);
   result = settings_install_property_parser (class,
+                                             g_param_spec_int ("gtk-cursor-blink-timeout",
+                                                               P_("Cursor Blink Timeout"),
+                                                               P_("Time after which the cursor stops blinking, in seconds"),
+                                                               1, G_MAXINT, 60,
+                                                               GTK_PARAM_READWRITE),
+                                             NULL);
+  g_assert (result == PROP_CURSOR_BLINK_TIMEOUT);
+  result = settings_install_property_parser (class,
                                              g_param_spec_boolean ("gtk-split-cursor",
 								   P_("Split Cursor"),
 								   P_("Whether two cursors should be displayed for mixed left-to-right and right-to-left text"),
Index: gtk+-2.10.2/gtk/gtktextview.c
===================================================================
--- gtk+-2.10.2.orig/gtk/gtktextview.c
+++ gtk+-2.10.2/gtk/gtktextview.c
@@ -4421,9 +4421,10 @@ gtk_text_view_forall (GtkContainer *cont
   g_slist_free (copy);
 }
 
-#define CURSOR_ON_MULTIPLIER 0.66
-#define CURSOR_OFF_MULTIPLIER 0.34
-#define CURSOR_PEND_MULTIPLIER 1.0
+#define CURSOR_ON_MULTIPLIER 2
+#define CURSOR_OFF_MULTIPLIER 1
+#define CURSOR_PEND_MULTIPLIER 3
+#define CURSOR_DIVIDER 3
 
 static gboolean
 cursor_blinks (GtkTextView *text_view)
@@ -4468,6 +4469,18 @@ get_cursor_time (GtkTextView *text_view)
   return time;
 }
 
+static gint
+get_cursor_blink_timeout (GtkTextView *text_view)
+{
+  GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (text_view));
+  gint time;
+
+  g_object_get (settings, "gtk-cursor-blink-timeout", &time, NULL);
+
+  return time;
+}
+
+
 /*
  * Blink!
  */
@@ -4495,14 +4508,20 @@ blink_cb (gpointer data)
 
   visible = gtk_text_layout_get_cursor_visible (text_view->layout);
 
-  if (visible)
-    text_view->blink_timeout = g_timeout_add (get_cursor_time (text_view) * CURSOR_OFF_MULTIPLIER,
+  if (text_view->cursor_time > 1000 * get_cursor_blink_timeout (text_view) ) {
+     /* we've blinked enough without the user doing anything, stop blinking */
+     visible = 0;
+     text_view->blink_timeout = 0;
+  } else if (visible)
+    text_view->blink_timeout = g_timeout_add (get_cursor_time (text_view) * CURSOR_OFF_MULTIPLIER / CURSOR_DIVIDER,
 					      blink_cb,
 					      text_view);
-  else
-    text_view->blink_timeout = g_timeout_add (get_cursor_time (text_view) * CURSOR_ON_MULTIPLIER,
+  else {
+    text_view->blink_timeout = g_timeout_add (get_cursor_time (text_view) * CURSOR_ON_MULTIPLIER / CURSOR_DIVIDER,
 					      blink_cb,
 					      text_view);
+    text_view->cursor_time += get_cursor_time (text_view);
+  }
 
   /* Block changed_handler while changing the layout's cursor visibility
    * because it would expose the whole paragraph. Instead, we expose
@@ -4548,7 +4567,7 @@ gtk_text_view_check_cursor_blink (GtkTex
 	    {
 	      gtk_text_layout_set_cursor_visible (text_view->layout, TRUE);
 	      
-	      text_view->blink_timeout = g_timeout_add (get_cursor_time (text_view) * CURSOR_OFF_MULTIPLIER,
+	      text_view->blink_timeout = g_timeout_add (get_cursor_time (text_view) * CURSOR_OFF_MULTIPLIER / CURSOR_DIVIDER,
 							blink_cb,
 							text_view);
 	    }
@@ -4569,6 +4588,7 @@ gtk_text_view_check_cursor_blink (GtkTex
 static void
 gtk_text_view_pend_cursor_blink (GtkTextView *text_view)
 {
+  text_view->cursor_time = 0;
   if (text_view->layout != NULL &&
       text_view->cursor_visible &&
       GTK_WIDGET_HAS_FOCUS (text_view) &&
@@ -4577,7 +4597,7 @@ gtk_text_view_pend_cursor_blink (GtkText
       gtk_text_view_stop_cursor_blink (text_view);
       gtk_text_layout_set_cursor_visible (text_view->layout, TRUE);
       
-      text_view->blink_timeout = g_timeout_add (get_cursor_time (text_view) * CURSOR_PEND_MULTIPLIER,
+      text_view->blink_timeout = g_timeout_add (get_cursor_time (text_view) * CURSOR_PEND_MULTIPLIER / CURSOR_DIVIDER,
 						blink_cb,
 						text_view);
     }
Index: gtk+-2.10.2/gtk/gtktextview.h
===================================================================
--- gtk+-2.10.2.orig/gtk/gtktextview.h
+++ gtk+-2.10.2/gtk/gtktextview.h
@@ -148,6 +148,8 @@ struct _GtkTextView
   GtkTextPendingScroll *pending_scroll;
 
   gint pending_place_cursor_button;
+
+  guint   cursor_time;  /* time in msec the cursor has blinked since last user event */
 };
 
 struct _GtkTextViewClass
