--- gdm-2.19.1/gui/greeter/greeter_item_ulist.c.a11y-fixes	2007-05-21 13:32:04.000000000 -0400
+++ gdm-2.19.1/gui/greeter/greeter_item_ulist.c	2007-05-21 13:32:04.000000000 -0400
@@ -236,17 +236,40 @@ greeter_populate_user_list (GtkTreeModel
 void
 greeter_item_ulist_select_user (gchar *login)
 {
-	printf ("%c%c%c%s\n", STX, BEL,
-		GDM_INTERRUPT_SELECT_USER, login);
+	/*printf ("%c%c%c%s\n", STX, BEL,
+	  GDM_INTERRUPT_SELECT_USER, login);*/
+	printf ("%c%s\n", STX, login);
 
 	fflush (stdout);
 }
 
+
+static GTimeVal last_key_press = {0, 0};
+static GTimeVal last_button_press = {0, 0};
+
 static void
 user_selected (GtkTreeSelection *selection, gpointer data)
 {
 	GtkTreeModel *tm = NULL;
 	GtkTreeIter iter = {0};
+	gboolean is_button_press;
+	guint64 button_msec;
+	guint64 key_msec;
+
+	/* HACK: determine whether selection changed because of key or
+	 * button press
+	 *
+	 * The rationale is this: if a face is pressed with the mouse
+	 * we should start authenticating that user right away. But if
+	 * the user uses keynav in the user list (think accessibility
+	 * and blind users) we shouldn't.
+	 */
+	button_msec = last_button_press.tv_sec * 1000 + last_button_press.tv_usec / 1000;
+	key_msec = last_key_press.tv_sec * 1000 + last_key_press.tv_usec / 1000;
+	is_button_press = FALSE;
+	if (button_msec > key_msec) {
+		is_button_press = TRUE;
+	}
 
 	if (gtk_tree_selection_get_selected (selection, &tm, &iter)) {
 		char *login;
@@ -255,14 +278,19 @@ user_selected (GtkTreeSelection *selecti
 				    &login, -1);
 		if (login != NULL) {
 			if (selecting_user && greeter_probably_login_prompt) {
-				gtk_entry_set_text (GTK_ENTRY (pam_entry), login);
+				if (is_button_press) {
+					gtk_entry_set_text (GTK_ENTRY (pam_entry), login);
+				} else {
+					gtk_entry_set_text (GTK_ENTRY (pam_entry), "");
+				}
 			}
 			if (selecting_user) {
 				GreeterItemInfo *pamlabel = greeter_lookup_id ("pam-message");
 				if (pamlabel == NULL) {
 					gdm_common_warning ("Theme broken: must have pam-message label!");
 				}
-				greeter_item_ulist_select_user (login);
+				if (is_button_press)
+					greeter_item_ulist_select_user (login);
 				if (selected_user != NULL)
 					g_free (selected_user);
 				selected_user = g_strdup (login);
@@ -272,9 +300,26 @@ user_selected (GtkTreeSelection *selecti
 }
 
 static void
-browser_change_focus (GtkWidget *widget, GdkEventButton *event, gpointer data)
+row_activated (GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data)
+{
+	if (selecting_user && greeter_probably_login_prompt) {
+		greeter_item_ulist_select_user (selected_user);
+	}
+}
+
+static gboolean
+tv_key_press (GtkWidget *entry, GdkEventKey *event, gpointer data)
 {
-	gtk_widget_grab_focus (pam_entry);
+	g_get_current_time (&last_key_press);
+	return FALSE;
+}
+
+
+static gboolean
+tv_button_press (GtkWidget *entry, GdkEventKey *event, gpointer data)
+{
+	g_get_current_time (&last_button_press);
+	return FALSE;
 }
 
 static void
@@ -285,6 +330,12 @@ greeter_generate_userlist (GtkWidget *tv
 	GtkTreeSelection *selection;
 	GList *list, *li;
 
+	AtkObject *atk_widget;
+	atk_widget = gtk_widget_get_accessible (tv);
+	if (atk_widget != NULL) {
+		atk_object_set_name (atk_widget, _("Select user to log in"));
+	}
+
 	gdm_greeter_users_init ();
 
 	check_for_displays ();
@@ -297,10 +348,13 @@ greeter_generate_userlist (GtkWidget *tv
 		g_signal_connect (selection, "changed",
 				  G_CALLBACK (user_selected),
 				  NULL);
-
-		g_signal_connect (GTK_TREE_VIEW (tv), "button_release_event",
-				  G_CALLBACK (browser_change_focus),
+		g_signal_connect (G_OBJECT (tv), "row-activated",
+				  G_CALLBACK (row_activated),
 				  NULL);
+		g_signal_connect (G_OBJECT (tv), "key-press-event",
+				  G_CALLBACK (tv_key_press), user_list);
+		g_signal_connect (G_OBJECT (tv), "button-press-event",
+				  G_CALLBACK (tv_button_press), user_list);
 
 		tm = (GtkTreeModel *)gtk_list_store_new (4,
 							 GDK_TYPE_PIXBUF,
