Index: gtk/gtkfilechooserdefault.c
===================================================================
--- gtk/gtkfilechooserdefault.c	(Revision 19662)
+++ gtk/gtkfilechooserdefault.c	(Arbeitskopie)
@@ -834,6 +834,7 @@ _gtk_file_chooser_default_init (GtkFileC
   impl->pending_select_paths = NULL;
   impl->location_mode = LOCATION_MODE_PATH_BAR;
   impl->operation_mode = OPERATION_MODE_BROWSE;
+  impl->single_click_activate = FALSE;
 
   gtk_box_set_spacing (GTK_BOX (impl), 12);
 
@@ -4464,6 +4465,44 @@ list_button_press_event_cb (GtkWidget   
   return TRUE;
 }
 
+/* When single-click is enabled, display a hand when cursor
+ * is above a file */
+static gboolean
+list_motion_cb (GtkWidget             *widget,
+		GdkEventMotion        *event,
+		GtkFileChooserDefault *impl)
+{
+  static GdkCursor *hand_cursor = NULL;
+  GdkDisplay *current_display;
+
+  if (!impl->single_click_activate || impl->has_busy_cursor)
+    return FALSE;
+
+  current_display = gtk_widget_get_display (widget);
+  g_assert (current_display != NULL);
+
+  if (hand_cursor != NULL &&
+      gdk_cursor_get_display (hand_cursor) != current_display)
+    {
+      gdk_cursor_unref (hand_cursor);
+      hand_cursor = NULL;
+    }
+
+
+  if (hand_cursor == NULL)
+    hand_cursor = gdk_cursor_new_for_display (current_display,
+					      GDK_HAND2);
+
+  if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget),
+			  	     event->x, event->y,
+				     NULL, NULL, NULL, NULL))
+    gdk_window_set_cursor (widget->window, hand_cursor);
+  else
+    gdk_window_set_cursor (widget->window, NULL);
+
+  return FALSE;
+}
+
 /* Sets the sort column IDs for the file list based on the operation mode */
 static void
 file_list_set_sort_column_ids (GtkFileChooserDefault *impl)
@@ -4612,6 +4651,8 @@ create_file_list (GtkFileChooserDefault 
 		    G_CALLBACK (list_popup_menu_cb), impl);
   g_signal_connect (impl->browse_files_tree_view, "button_press_event",
 		    G_CALLBACK (list_button_press_event_cb), impl);
+  g_signal_connect (impl->browse_files_tree_view, "motion_notify_event",
+		    G_CALLBACK (list_motion_cb), impl);
 
   g_signal_connect (impl->browse_files_tree_view, "drag_data_received",
                     G_CALLBACK (file_list_drag_data_received_cb), impl);
@@ -5910,6 +5951,29 @@ change_icon_theme (GtkFileChooserDefault
   profile_end ("end", NULL);
 }
 
+/* Changes the single click policy wherever it is needed */
+static void
+change_single_click_policy (GtkFileChooserDefault *impl)
+{
+  GtkSettings *settings;
+
+  profile_start ("start", NULL);
+
+  settings = gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (impl)));
+  g_object_get (settings, "gtk-files-single-click-activate", &(impl->single_click_activate), NULL);
+  _gtk_tree_view_set_single_click_activate (GTK_TREE_VIEW (impl->browse_files_tree_view), impl->single_click_activate);
+
+  /* unset the current cursor if it's the old single-click cursor */
+  if (impl->browse_files_tree_view->window != NULL && 
+      !impl->single_click_activate && !impl->has_busy_cursor)
+    {
+      gdk_window_set_cursor (impl->browse_files_tree_view->window, NULL);
+      gdk_display_flush (gtk_widget_get_display (GTK_WIDGET (impl->browse_files_tree_view)));
+    }
+
+  profile_end ("end", NULL);
+}
+
 /* Callback used when a GtkSettings value changes */
 static void
 settings_notify_cb (GObject               *object,
@@ -5925,6 +5989,8 @@ settings_notify_cb (GObject             
   if (strcmp (name, "gtk-icon-theme-name") == 0 ||
       strcmp (name, "gtk-icon-sizes") == 0)
     change_icon_theme (impl);
+  else if (strcmp (name, "gtk-files-single-click-activate") == 0)
+    change_single_click_policy (impl);
 
   profile_end ("end", NULL);
 }
@@ -5933,7 +5999,7 @@ settings_notify_cb (GObject             
  * the icon theme.
  */
 static void
-check_icon_theme (GtkFileChooserDefault *impl)
+check_settings (GtkFileChooserDefault *impl)
 {
   GtkSettings *settings;
 
@@ -5952,6 +6018,7 @@ check_icon_theme (GtkFileChooserDefault 
 						   G_CALLBACK (settings_notify_cb), impl);
 
       change_icon_theme (impl);
+      change_single_click_policy (impl);
     }
 
   profile_end ("end", NULL);
@@ -6014,7 +6081,7 @@ gtk_file_chooser_default_screen_changed 
     GTK_WIDGET_CLASS (_gtk_file_chooser_default_parent_class)->screen_changed (widget, previous_screen);
 
   remove_settings_signal (impl, previous_screen);
-  check_icon_theme (impl);
+  check_settings (impl);
   recent_manager_update (impl);
 
   g_signal_emit_by_name (widget, "default-size-changed");
@@ -6354,6 +6421,8 @@ set_busy_cursor (GtkFileChooserDefault *
 
   if (cursor)
     gdk_cursor_unref (cursor);
+
+  impl->has_busy_cursor = busy;
 }
 
 /* Creates a sort model to wrap the file system model and sets it on the tree view */
Index: gtk/gtkfilechooserprivate.h
===================================================================
--- gtk/gtkfilechooserprivate.h	(Revision 19662)
+++ gtk/gtkfilechooserprivate.h	(Arbeitskopie)
@@ -276,6 +276,7 @@ struct _GtkFileChooserDefault
 
   gulong settings_signal_id;
   int icon_size;
+  gboolean single_click_activate;
 
   gulong toplevel_set_focus_id;
   GtkWidget *toplevel_last_focus_widget;
@@ -305,6 +306,8 @@ struct _GtkFileChooserDefault
   guint has_search : 1;
   guint has_recent : 1;
 
+  guint has_busy_cursor : 1;
+
 #if 0
   guint shortcuts_drag_outside : 1;
 #endif
Index: gtk/gtktreeview.c
===================================================================
--- gtk/gtktreeview.c	(Revision 19662)
+++ gtk/gtktreeview.c	(Arbeitskopie)
@@ -2956,6 +2956,46 @@ gtk_tree_view_button_release_column_resi
 }
 
 static gboolean
+gtk_tree_view_button_release_single_click (GtkTreeView *tree_view,
+					   GdkEventButton *event)
+{
+   gboolean retval = FALSE;
+
+   if (tree_view->priv->single_click_activate &&
+       (tree_view->priv->selection->type != GTK_SELECTION_MULTIPLE ||
+       (event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) == 0))
+     {
+       GtkTreePath *path;
+       GtkTreeViewColumn *column;
+
+       gtk_tree_view_get_path_at_pos (tree_view,
+                                      event->x, event->y,
+                                      &path,
+                                      &column,
+                                     NULL,
+                                     NULL);
+       if (path != NULL)
+         {
+           GtkRBTree *tree = NULL;
+           GtkRBNode *node = NULL;
+
+          _gtk_tree_view_find_node (tree_view, path,
+                                    &tree, &node);
+          if (node != NULL && (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED)))
+             {
+               gtk_tree_view_row_activated (tree_view, path, column);
+               retval = TRUE;
+             }
+         }
+
+       gtk_tree_path_free (path);
+     }
+
+  return retval;
+}
+
+
+static gboolean
 gtk_tree_view_button_release (GtkWidget      *widget,
 			      GdkEventButton *event)
 {
@@ -2979,7 +3019,7 @@ gtk_tree_view_button_release (GtkWidget 
     return gtk_tree_view_button_release_column_resize (widget, event);
 
   if (tree_view->priv->button_pressed_node == NULL)
-    return FALSE;
+    return gtk_tree_view_button_release_single_click (tree_view, event);
 
   if (event->button == 1)
     {
@@ -3003,6 +3043,7 @@ gtk_tree_view_button_release (GtkWidget 
 					     tree_view->priv->button_pressed_tree,
 					     tree_view->priv->button_pressed_node, TRUE);
 	  gtk_tree_path_free (path);
+
 	}
 
       tree_view->priv->button_pressed_tree = NULL;
@@ -6454,6 +6495,15 @@ _gtk_tree_view_column_autosize (GtkTreeV
   gtk_widget_queue_resize (GTK_WIDGET (tree_view));
 }
 
+void
+_gtk_tree_view_set_single_click_activate (GtkTreeView *tree_view,
+					  gboolean     single_click_activate)
+{
+  g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
+
+  tree_view->priv->single_click_activate = single_click_activate;
+}
+
 /* Drag-and-drop */
 
 static void
Index: gtk/gtksettings.c
===================================================================
--- gtk/gtksettings.c	(Revision 19662)
+++ gtk/gtksettings.c	(Arbeitskopie)
@@ -107,7 +107,8 @@ enum {
   PROP_ENABLE_MNEMONICS,
   PROP_ENABLE_ACCELS,
   PROP_RECENT_FILES_LIMIT,
-  PROP_IM_MODULE
+  PROP_IM_MODULE,
+  PROP_FILES_SINGLE_CLICK_ACTIVATE
 };
 
 
@@ -820,6 +821,23 @@ gtk_settings_class_init (GtkSettingsClas
 								  GTK_PARAM_READWRITE),
 					     NULL);
   g_assert (result == PROP_IM_MODULE);
+
+  /**
+   * GtkSettings:gtk-file-manager-single-click-activate:
+   *
+   * Whether file should be activated with one click in the file manager
+   * and in GTK+ file choosers.
+   *
+   * Since: 2.14
+   */
+  result = settings_install_property_parser (class,
+                                             g_param_spec_boolean ("gtk-files-single-click-activate",
+						     		   P_("Activate Files on Single Click"),
+								   P_("Whether files and folders should be activated on single or double click"),
+								   FALSE,
+								   GTK_PARAM_READWRITE),
+                                             NULL);
+  g_assert (result == PROP_FILES_SINGLE_CLICK_ACTIVATE);
 }
 
 static void
Index: gtk/gtktreeprivate.h
===================================================================
--- gtk/gtktreeprivate.h	(Revision 19662)
+++ gtk/gtktreeprivate.h	(Arbeitskopie)
@@ -212,6 +212,8 @@ struct _GtkTreeViewPrivate
   guint has_rules : 1;
   guint mark_rows_col_dirty : 1;
 
+  guint single_click_activate : 1;
+
   /* for DnD */
   guint empty_view_drop : 1;
 
@@ -433,6 +435,8 @@ void              _gtk_tree_view_column_
 							    GtkCellRenderer   *cell,
 							    gint              *left,
 							    gint              *right);
+void              _gtk_tree_view_set_single_click_activate (GtkTreeView       *tree_view,
+							    gboolean           single_click_activate);
 
 
 G_END_DECLS
