Index: gtk+-2.10.2/gtk/gtkentry.c
===================================================================
--- gtk+-2.10.2.orig/gtk/gtkentry.c
+++ gtk+-2.10.2/gtk/gtkentry.c
@@ -4256,6 +4256,8 @@ gtk_entry_set_invisible_char (GtkEntry *
   gtk_entry_recompute (entry);  
 }
 
+
+
 /**
  * gtk_entry_get_invisible_char:
  * @entry: a #GtkEntry
@@ -4274,6 +4276,27 @@ gtk_entry_get_invisible_char (GtkEntry *
   return entry->invisible_char;
 }
 
+/**
+ * gtk_entry_disable_cursor_blink_when_empty:
+ * @entry: a #GtkEntry
+ *
+ * This function changes the cursor blink behavior of the entry to
+ * not blink when the entry box has never been typed into. This is a useful
+ * flag to set for entry boxes that are visible for long periods of time
+ * while nothing is typed into them (example: the gdm username box).
+ * Cursor blinking takes system resources and power and can be avoided
+ * without too much user annoyance in those entry boxes.
+ *
+ **/
+void
+gtk_entry_disable_cursor_blink_when_empty (GtkEntry *entry)
+{
+  g_return_if_fail (GTK_IS_ENTRY (entry));
+
+  entry->no_blink_on_emtpy = 1;
+}
+
+
 void
 gtk_entry_set_editable (GtkEntry *entry,
 			gboolean  editable)
@@ -5189,9 +5212,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)
@@ -5199,15 +5223,17 @@ cursor_blinks (GtkEntry *entry)
   GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (entry));
   gboolean blink;
 
-  if (GTK_WIDGET_HAS_FOCUS (entry) &&
-      entry->editable &&
-      entry->selection_bound == entry->current_pos)
-    {
-      g_object_get (settings, "gtk-cursor-blink", &blink, NULL);
-      return blink;
-    }
-  else
-    return FALSE;
+  if (!GTK_WIDGET_HAS_FOCUS (entry))
+	return FALSE;
+  if (!entry->editable)
+	return FALSE;
+  if (entry->selection_bound != entry->current_pos)
+	return FALSE;
+  if (entry->no_blink_on_emtpy && entry->text[0] == 0)
+	return FALSE;
+
+  g_object_get (settings, "gtk-cursor-blink", &blink, NULL);
+  return blink;
 }
 
 static gint
@@ -5252,6 +5278,7 @@ static gint
 blink_cb (gpointer data)
 {
   GtkEntry *entry;
+  int empty_multiplier = 1;
 
   GDK_THREADS_ENTER ();
 
@@ -5267,17 +5294,20 @@ blink_cb (gpointer data)
   g_assert (GTK_WIDGET_HAS_FOCUS (entry));
   g_assert (entry->selection_bound == entry->current_pos);
 
+  if (entry->text[0] == 0)
+	empty_multiplier = 2; /* a fully empty entry box can blink slower to save power */
+
   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 (empty_multiplier * 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->blink_timeout = g_timeout_add (get_cursor_time (entry) * CURSOR_ON_MULTIPLIER / CURSOR_DIVIDER,
 					    blink_cb,
 					    entry);
     }
@@ -5295,10 +5325,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
@@ -5322,7 +5352,7 @@ gtk_entry_pend_cursor_blink (GtkEntry *e
       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
@@ -85,6 +85,7 @@ struct _GtkEntry
   guint        select_lines           : 1;
   guint        resolved_dir           : 4; /* PangoDirection */
   guint        truncate_multiline     : 1;
+  guint        no_blink_on_emtpy      : 1; /* Disable cursor blinking when empty */
 
   guint   button;
   guint   blink_timeout;
@@ -149,6 +150,8 @@ gboolean   gtk_entry_get_visibility     
 void       gtk_entry_set_invisible_char         (GtkEntry      *entry,
                                                  gunichar       ch);
 gunichar   gtk_entry_get_invisible_char         (GtkEntry      *entry);
+void       gtk_entry_disable_cursor_blink_when_empty (GtkEntry *entry);
+
 void       gtk_entry_set_has_frame              (GtkEntry      *entry,
                                                  gboolean       setting);
 gboolean   gtk_entry_get_has_frame              (GtkEntry      *entry);
