itamarjp / rpms / gdm

Forked from rpms/gdm 6 years ago
Clone
David Zeuthen 62183ef
Index: gui/greeter/greeter_item_ulist.c
David Zeuthen 62183ef
===================================================================
David Zeuthen 62183ef
--- gui/greeter/greeter_item_ulist.c	(revision 4626)
David Zeuthen 62183ef
+++ gui/greeter/greeter_item_ulist.c	(working copy)
David Zeuthen 62183ef
@@ -217,18 +217,41 @@
David Zeuthen 62183ef
 void 
David Zeuthen 62183ef
 greeter_item_ulist_select_user (gchar *login)
David Zeuthen 62183ef
 {
David Zeuthen 62183ef
-	printf ("%c%c%c%s\n", STX, BEL,
David Zeuthen 62183ef
-		GDM_INTERRUPT_SELECT_USER, login);
David Zeuthen 62183ef
+	/*printf ("%c%c%c%s\n", STX, BEL,
David Zeuthen 62183ef
+	  GDM_INTERRUPT_SELECT_USER, login);*/
David Zeuthen 62183ef
+	printf ("%c%s\n", STX, login);
David Zeuthen 62183ef
 
David Zeuthen 62183ef
 	fflush (stdout);
David Zeuthen 62183ef
 }
David Zeuthen 62183ef
 
David Zeuthen 62183ef
+
David Zeuthen 62183ef
+static GTimeVal last_key_press = {0, 0};
David Zeuthen 62183ef
+static GTimeVal last_button_press = {0, 0};
David Zeuthen 62183ef
+
David Zeuthen 62183ef
 static void
David Zeuthen 62183ef
 user_selected (GtkTreeSelection *selection, gpointer data)
David Zeuthen 62183ef
 {
David Zeuthen 62183ef
 	GtkTreeModel *tm = NULL;
David Zeuthen 62183ef
 	GtkTreeIter iter = {0};
David Zeuthen 62183ef
+	gboolean is_button_press;
David Zeuthen 62183ef
+	guint64 button_msec;
David Zeuthen 62183ef
+	guint64 key_msec;
David Zeuthen 62183ef
 
David Zeuthen 62183ef
+	/* HACK: determine whether selection changed because of key or
David Zeuthen 62183ef
+	 * button press
David Zeuthen 62183ef
+	 *
David Zeuthen 62183ef
+	 * The rationale is this: if a face is pressed with the mouse
David Zeuthen 62183ef
+	 * we should start authenticating that user right away. But if
David Zeuthen 62183ef
+	 * the user uses keynav in the user list (think accessibility
David Zeuthen 62183ef
+	 * and blind users) we shouldn't.
David Zeuthen 62183ef
+	 */
David Zeuthen 62183ef
+	button_msec = last_button_press.tv_sec * 1000 + last_button_press.tv_usec / 1000;
David Zeuthen 62183ef
+	key_msec = last_key_press.tv_sec * 1000 + last_key_press.tv_usec / 1000;
David Zeuthen 62183ef
+	is_button_press = FALSE;
David Zeuthen 62183ef
+	if (button_msec > key_msec) {
David Zeuthen 62183ef
+		is_button_press = TRUE;
David Zeuthen 62183ef
+	}
David Zeuthen 62183ef
+
David Zeuthen 62183ef
 	if (gtk_tree_selection_get_selected (selection, &tm, &iter)) {
David Zeuthen 62183ef
 		char *login;
David Zeuthen 62183ef
 
David Zeuthen 62183ef
@@ -236,14 +259,19 @@
David Zeuthen 62183ef
 				    &login, -1);
David Zeuthen 62183ef
 		if (login != NULL) {
David Zeuthen 62183ef
 			if (selecting_user && greeter_probably_login_prompt) {
David Zeuthen 62183ef
-				gtk_entry_set_text (GTK_ENTRY (pam_entry), login);
David Zeuthen 62183ef
+				if (is_button_press) {
David Zeuthen 62183ef
+					gtk_entry_set_text (GTK_ENTRY (pam_entry), login);
David Zeuthen 62183ef
+				} else {
David Zeuthen 62183ef
+					gtk_entry_set_text (GTK_ENTRY (pam_entry), "");
David Zeuthen 62183ef
+				}
David Zeuthen 62183ef
 			}
David Zeuthen 62183ef
 			if (selecting_user) {
David Zeuthen 62183ef
 				GreeterItemInfo *pamlabel = greeter_lookup_id ("pam-message");
David Zeuthen 62183ef
 				if (pamlabel == NULL) {
David Zeuthen 62183ef
 					gdm_common_warning ("Theme broken: must have pam-message label!");
David Zeuthen 62183ef
 				}
David Zeuthen 62183ef
-				greeter_item_ulist_select_user (login);
David Zeuthen 62183ef
+				if (is_button_press)
David Zeuthen 62183ef
+					greeter_item_ulist_select_user (login);
David Zeuthen 62183ef
 				if (selected_user != NULL)
David Zeuthen 62183ef
 					g_free (selected_user);
David Zeuthen 62183ef
 				selected_user = g_strdup (login);
David Zeuthen 62183ef
@@ -253,11 +281,28 @@
David Zeuthen 62183ef
 }
David Zeuthen 62183ef
 
David Zeuthen 62183ef
 static void
David Zeuthen 62183ef
-browser_change_focus (GtkWidget *widget, GdkEventButton *event, gpointer data)
David Zeuthen 62183ef
+row_activated (GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data)
David Zeuthen 62183ef
 {
David Zeuthen 62183ef
-	gtk_widget_grab_focus (pam_entry);
David Zeuthen 62183ef
+	if (selecting_user && greeter_probably_login_prompt) {
David Zeuthen 62183ef
+		greeter_item_ulist_select_user (selected_user);
David Zeuthen 62183ef
+	}
David Zeuthen 62183ef
 }
David Zeuthen 62183ef
 
David Zeuthen 62183ef
+static gboolean
David Zeuthen 62183ef
+tv_key_press (GtkWidget *entry, GdkEventKey *event, gpointer data)
David Zeuthen 62183ef
+{
David Zeuthen 62183ef
+	g_get_current_time (&last_key_press);
David Zeuthen 62183ef
+	return FALSE;
David Zeuthen 62183ef
+}
David Zeuthen 62183ef
+
David Zeuthen 62183ef
+
David Zeuthen 62183ef
+static gboolean
David Zeuthen 62183ef
+tv_button_press (GtkWidget *entry, GdkEventKey *event, gpointer data)
David Zeuthen 62183ef
+{
David Zeuthen 62183ef
+	g_get_current_time (&last_button_press);
David Zeuthen 62183ef
+	return FALSE;
David Zeuthen 62183ef
+}
David Zeuthen 62183ef
+
David Zeuthen 62183ef
 static void
David Zeuthen 62183ef
 greeter_generate_userlist (GtkWidget *tv)
David Zeuthen 62183ef
 {
David Zeuthen 62183ef
@@ -267,6 +312,12 @@
David Zeuthen 62183ef
 	GreeterItemInfo *info;
David Zeuthen 62183ef
 	GList *list, *li;
David Zeuthen 62183ef
 
David Zeuthen 62183ef
+	AtkObject *atk_widget;
David Zeuthen 62183ef
+	atk_widget = gtk_widget_get_accessible (tv);
David Zeuthen 62183ef
+	if (atk_widget != NULL) {
David Zeuthen 62183ef
+		atk_object_set_name (atk_widget, _("Select user to log in"));
David Zeuthen 62183ef
+	}
David Zeuthen 62183ef
+
David Zeuthen 62183ef
 	gdm_greeter_users_init ();
David Zeuthen 62183ef
 
David Zeuthen 62183ef
 	check_for_displays ();
David Zeuthen 62183ef
@@ -279,11 +330,14 @@
David Zeuthen 62183ef
 		g_signal_connect (selection, "changed",
David Zeuthen 62183ef
 				  G_CALLBACK (user_selected),
David Zeuthen 62183ef
 				  NULL);
David Zeuthen 62183ef
-
David Zeuthen 62183ef
-		g_signal_connect (GTK_TREE_VIEW (tv), "button_release_event",
David Zeuthen 62183ef
-				  G_CALLBACK (browser_change_focus),
David Zeuthen 62183ef
+		g_signal_connect (G_OBJECT (tv), "row-activated",
David Zeuthen 62183ef
+				  G_CALLBACK (row_activated),
David Zeuthen 62183ef
 				  NULL);
David Zeuthen 62183ef
+		g_signal_connect (G_OBJECT (tv), "key-press-event",
David Zeuthen 62183ef
+				  G_CALLBACK (tv_key_press), user_list);
David Zeuthen 62183ef
+		g_signal_connect (G_OBJECT (tv), "button-press-event",
David Zeuthen 62183ef
+				  G_CALLBACK (tv_button_press), user_list);
David Zeuthen 62183ef
 
David Zeuthen 62183ef
 		tm = (GtkTreeModel *)gtk_list_store_new (4,
David Zeuthen 62183ef
 							 GDK_TYPE_PIXBUF,
David Zeuthen 62183ef
 
David Zeuthen 62183ef
Index: gui/greeter/greeter_item_pam.c
David Zeuthen 62183ef
===================================================================
David Zeuthen 62183ef
--- gui/greeter/greeter_item_pam.c	(revision 4626)
David Zeuthen 62183ef
+++ gui/greeter/greeter_item_pam.c	(working copy)
David Zeuthen 62183ef
@@ -184,14 +184,6 @@
David Zeuthen 62183ef
        const char *login_string;
David Zeuthen 62183ef
 	GtkWidget *entry = GNOME_CANVAS_WIDGET (entry_info->item)->widget;
David Zeuthen 62183ef
 
David Zeuthen 62183ef
-       if ((event->keyval == GDK_Tab ||
David Zeuthen 62183ef
-            event->keyval == GDK_KP_Tab) &&
David Zeuthen 62183ef
-           (event->state & (GDK_CONTROL_MASK|GDK_MOD1_MASK|GDK_SHIFT_MASK)) == 0)
David Zeuthen 62183ef
-          {
David Zeuthen 62183ef
-		greeter_item_pam_login (GTK_ENTRY (entry), entry_info);
David Zeuthen 62183ef
-		return TRUE;
David Zeuthen 62183ef
-           }
David Zeuthen 62183ef
-
David Zeuthen 62183ef
        if (gtk_ok_button != NULL)
David Zeuthen 62183ef
           {
David Zeuthen 62183ef
              /*
David Zeuthen 62183ef
@@ -208,6 +200,19 @@
David Zeuthen 62183ef
   return FALSE;
David Zeuthen 62183ef
 }
David Zeuthen 62183ef
 
David Zeuthen 62183ef
+/* We *never* want to lose focus when we are in the process of
David Zeuthen 62183ef
+ * authenticating the user */
David Zeuthen 62183ef
+static gboolean 
David Zeuthen 62183ef
+pam_focus_out_event (GtkWidget     *widget,
David Zeuthen 62183ef
+		     GdkEventFocus *event,
David Zeuthen 62183ef
+		     gpointer       user_data)
David Zeuthen 62183ef
+{
David Zeuthen 62183ef
+	if (!greeter_probably_login_prompt) {
David Zeuthen 62183ef
+		gtk_widget_grab_focus (widget);
David Zeuthen 62183ef
+	}
David Zeuthen 62183ef
+	return FALSE;
David Zeuthen 62183ef
+}
David Zeuthen 62183ef
+
David Zeuthen 62183ef
 gboolean
David Zeuthen 62183ef
 greeter_item_pam_setup (void)
David Zeuthen 62183ef
 {
David Zeuthen 62183ef
@@ -238,7 +243,9 @@
David Zeuthen 62183ef
       g_signal_connect (entry, "activate",
David Zeuthen 62183ef
 			G_CALLBACK (greeter_item_pam_login), entry_info);
David Zeuthen 62183ef
       g_signal_connect (G_OBJECT (entry), "key_release_event",
David Zeuthen 62183ef
-		        G_CALLBACK (pam_key_release_event), NULL);
David Zeuthen 62183ef
+			G_CALLBACK (pam_key_release_event), NULL);
David Zeuthen 62183ef
+      g_signal_connect (G_OBJECT (entry), "focus-out-event",
David Zeuthen 62183ef
+			G_CALLBACK (pam_focus_out_event), NULL);
David Zeuthen 62183ef
     }
David Zeuthen 62183ef
 
David Zeuthen 62183ef
   return TRUE;
David Zeuthen 62183ef
@@ -260,6 +267,21 @@
David Zeuthen 62183ef
   if (conversation_info)
David Zeuthen 62183ef
     {
David Zeuthen 62183ef
       set_text (conversation_info, message);
David Zeuthen 62183ef
+
David Zeuthen 62183ef
+      if (entry_info != NULL) {
David Zeuthen 62183ef
+	      GnomeCanvasWidget *item = GNOME_CANVAS_WIDGET (entry_info->item);
David Zeuthen 62183ef
+	      if (item != NULL) {
David Zeuthen 62183ef
+		      GtkWidget *widget = item->widget;
David Zeuthen 62183ef
+		      if (widget != NULL) {
David Zeuthen 62183ef
+			      AtkObject *atk_widget;
David Zeuthen 62183ef
+			      atk_widget = gtk_widget_get_accessible (widget);
David Zeuthen 62183ef
+			      if (atk_widget != NULL) {
David Zeuthen 62183ef
+				      atk_object_set_name (atk_widget, message);
David Zeuthen 62183ef
+			      }
David Zeuthen 62183ef
+		      }
David Zeuthen 62183ef
+	      }
David Zeuthen 62183ef
+      }
David Zeuthen 62183ef
+
David Zeuthen 62183ef
     }
David Zeuthen 62183ef
   
David Zeuthen 62183ef
   if (entry_info && entry_info->item &&
David Zeuthen 62183ef